目前我正在学习有关MySQL的交易和锁定功能。
与隔离级别的事务SERIALIZABLE
之间和语句LOCK
和UNLOCK
对同一个表的语句执行相互排斥?
编辑1:对于交易的事情与隔离级别SERIALIZABLE
,它甚至有可能以确定交易是否实际上是相互排斥的,或只是没有像幽灵要求读得到满足? 还是这两个属性意味着相同的行为?
编辑2:哦,是提供,如果两个或两个以上的交易才有效事务的给定隔离级别相同的数据的实际工作,使读的现象可能实际发生的机制是什么?
目前我正在学习有关MySQL的交易和锁定功能。
与隔离级别的事务SERIALIZABLE
之间和语句LOCK
和UNLOCK
对同一个表的语句执行相互排斥?
编辑1:对于交易的事情与隔离级别SERIALIZABLE
,它甚至有可能以确定交易是否实际上是相互排斥的,或只是没有像幽灵要求读得到满足? 还是这两个属性意味着相同的行为?
编辑2:哦,是提供,如果两个或两个以上的交易才有效事务的给定隔离级别相同的数据的实际工作,使读的现象可能实际发生的机制是什么?
在InnoDB中,所有的序列化并是把一个SELECT
成隐SELECT...LOCK IN SHARE MODE
。 因此,这不仅影响INSERT / UPDATE / DELETE对同一行(S)。
你可以观察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
我所做的只是SELECT * FROM imdb.kind_type
设置TX_ISOLATION = SERIALIZABLE和autcommit = 0之后。
你看,它拥有的IS表锁定,这将阻止LOCK TABLES kind_type WRITE
。
但是,如果你执行交易的自动提交模式,它甚至不这样做; 它只是就像REPEATABLE-READ。