要搞清楚for update和for update nowait是对什么而言的!
它们是对select而言的,因为一般select不加锁,而如果你由于一些原因想给select加锁,就要用到它们。
用for update,如果这个行已经被其它的事务加了锁,那么它就在那里等待对方释放锁然后自己加锁,所以看起来它就像你所说的“hang”住了。
用for update nowait,功能也是一样的,即请求select加锁,而如果已经有别的事务在它上面加了锁,那么它不像for update那样等待其释放锁然后加锁,而是直接返回一个错误或者说是提示给用户,也就是你想看到的返回的错误。
1 select * from TTable1 for update 锁定表的所有行,只能读不能写
2 select * from TTable1 where pkid = 1 for update 只锁定pkid=1的行
3 select * from Table1 a join Table2 b on a.pkid=b.pkid for update 锁定两个表的所有记录
4 select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update 锁定两个表的中满足条件的行
5. select * from Table1 a join Table2 b on a.pkid=b.pkid where a.pkid = 10 for update of a.pkid 只锁定Table1中满足条件的行 for update 是把所有的表都锁点 for update of 根据of 后表的条件锁定相对应的表
加行级共享锁,然后以独占方式进行修改数据(update,delete),
你FOR UPDATE 的时候 ,其他人不能更改你查询出来的记录
commit和rollback都可以释放锁
DML锁包括table-level locks(TM)和Row-level locks(TX)
说明row-level lock(TX type)是为了确保其它用户不可以在相同的时间修改相同的行
TM 是对象锁,表示可能在这个对象上做了什么操作,还没有结束,所以不允许ddl
TX 是事务锁,表示发起了一个事务,发起事务的判别标准
![]()
posted on
浙公网安备 33010602011771号