我目前正在学习MySQL的交易和锁定功能。
隔离级别SERIALIZABLE
的事务和同一个表上的LOCK
和UNLOCK
语句之间的语句是否互斥?
编辑1 :对于具有隔离级别SERIALIZABLE
的事务,是否可以确定事务是否实际上是互斥的,还是仅满足没有虚拟读取的要求?或者这两个属性是否意味着相同的行为?
编辑2 :哦,并且提供给定的事务隔离级别的机制只有在两个或多个事务实际处理相同数据时才会激活,以便实际发生读取现象?
答案 0 :(得分:0)
在InnoDB中,所有SERIALIZABLE都会将SELECT
转换为隐式SELECT...LOCK IN SHARE MODE
。所以这只会影响对同一行的INSERT / UPDATE / DELETE。
您可以在SHOW ENGINE INNODB STATUS中观察锁定:
---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后,我所做的只是SELECT * FROM imdb.kind_type
。
你看到它拥有一个IS表锁,它将阻止LOCK TABLES kind_type WRITE
。
但如果您正在执行事务自动提交模式,它甚至不会这样做;它就像REPEATABLE-READ一样。