关于DQL语句的悲观锁?
对于一个DQL语句来说,末尾是可以添加这样一个关键句的:for update;
select ename ,sal from emp where job = ‘Tom’ for update;
以上DQL语句的含义是:
- 在本次事务的执行过程中,job = ‘Tom’的记录被查询,这些记录在查询额过程中,任何人,任何事务都不能对这些记录进行修改操作。直到当前事务结束。(隔离级别没有关系)
这种机制被称为:行级锁机制(又叫做悲观锁!)
在mysql中是这样的:
- 当使用select … where … for update …时,mysql进行row lock还是table lock只取决于是否能使用索引(例如主键,unique字段),能则为行锁,否则为表锁;未查到数据则无锁。而使用‘<>’,'like’等操作时,索引会失效,自然是进行的是table lock。
- 所以慎用for update。
- 整个表锁住时会导致性能降低,谨慎适用!
- 使用forupdate的时候,最好锁主键值,或者具有unique约束的字段,锁别的字段可能会导致整个表锁住。