我目前正在学习MySQL的事务和锁特性。
具有隔离级别SERIALIZABLE的事务以及同一表上的LOCK和UNLOCK语句之间的语句是否相互排斥?
编辑1:对于具有隔离级别SERIALIZABLE的事务,是否有可能确定事务实际上是互斥的,还是仅仅满足不满足幻影读取之类的需求?或者这两个属性意味着相同的行为?
编辑2:噢,提供给定事务隔离级别的机制是否只有在两个或多个事务对相同的数据实际工作时才是活动的,这样读现象才有可能发生?
发布于 2014-11-18 20:15:29
在InnoDB中,SERIALIZABLE所做的所有工作都是将SELECT转换为隐式SELECT...LOCK IN SHARE MODE。因此,这只会影响针对同一行的INSERT/UPDATE/DELETE。
您可以观察显示引擎INNODB状态中的锁:
---TRANSACTION 14594, ACTIVE 5 sec
2 lock struct(s), heap size 360, 8 row lock(s)
MySQL thread id 24, OS thread handle 0x7f65c8624700, query id 324 192.168.56.1 root cleaning up
TABLE LOCK table `imdb`.`kind_type` trx id 14594 lock mode IS
RECORD LOCKS space id 24 page no 4 n bits 80 index `kind` of table `imdb`.`kind_type` trx id 14594 lock mode S我所做的就是在设置了tx_isolation=SERIALIZABLE和autcommit=0之后的tx_isolation=SERIALIZABLE。
您可以看到它持有一个IS表锁,这将阻止一个LOCK TABLES kind_type WRITE。
但是,如果您正在执行事务自动提交模式,它甚至不会这样做;它的作用就像可重复读取。
https://stackoverflow.com/questions/26982261
复制相似问题