Know More About Oracle Row Lock
2012-05-16 14:13
495 查看
我们都知道在Oracle中实现了细粒度的行锁row lock,且在ORACLE的内部实现中没有使用基于内存的行锁管理器,row lock是依赖于数据块本身实现的。换句话说判定一行数据究竟有没有没锁住,要求Server Process去pin住相应的block buffer并检查才能够发现。
但是试想一个场景,若process A 通过update语句锁定了数据表 Z数据块上的一行数据, 并长时间既没有rollback亦没有commit;此时Process B也运行了一条DML语句, 它通过索引找到rowid并找到了 Z数据块, 它发现这一行数据已经被process A发起的一个事务的ITL锁住了,它可能试图做一些cleanout操作,但是发现被锁住的row在相关的事务表中仍未被commit, 那么很抱歉的是Process B需要进入"enq: TX - row lock contention"的等待事件了。 问题在于Process B的无尽等待的终结在哪里呢?
有同学肯定会说只要Process A释放了其锁定的row,那么Process B就会立即结束其"enq: TX - row lock contention"等待了。
事实是这样的吗?本文出自 “Ask Maclean Liu Oracle” 博客,请务必保留此出处http://maclean.blog.51cto.com/2923249/1278318
但是试想一个场景,若process A 通过update语句锁定了数据表 Z数据块上的一行数据, 并长时间既没有rollback亦没有commit;此时Process B也运行了一条DML语句, 它通过索引找到rowid并找到了 Z数据块, 它发现这一行数据已经被process A发起的一个事务的ITL锁住了,它可能试图做一些cleanout操作,但是发现被锁住的row在相关的事务表中仍未被commit, 那么很抱歉的是Process B需要进入"enq: TX - row lock contention"的等待事件了。 问题在于Process B的无尽等待的终结在哪里呢?
有同学肯定会说只要Process A释放了其锁定的row,那么Process B就会立即结束其"enq: TX - row lock contention"等待了。
事实是这样的吗?本文出自 “Ask Maclean Liu Oracle” 博客,请务必保留此出处http://maclean.blog.51cto.com/2923249/1278318
相关文章推荐
- Know More About Oracle Row Lock(二、解决疑惑,说明行级锁和TX锁即事务锁是不同概念的两个东西)
- Know More About Oracle Row Lock
- Know more about LOCK_SGA Parameter
- Know more about Oracle Nologging
- Know More about Oracle PGA Memory
- Know more about Oracle Nologging
- Know more about Oracle User Space Quota
- Know more about Oracle Latches
- Know more about Oracle User Space Quota
- Know more about Oracle Latches
- Know More about Oracle PGA Memory
- Know more about LOCK_SGA Parameter
- Know more about Oracle Nologging
- Know Oracle Lock Mode
- Probably more than you want to know about keyboarding in Windows Forms
- Know more about checkpoint
- Know more about Enqueue Deadlock Detection
- More than you ever wanted to know about GeoJSON
- Know more about RBA redo block address
- Oracle Row cache lock图解