【问题标题】:MySQL - Mutual exclusion in transactions and locks?MySQL - 事务和锁的互斥?
【发布时间】:2014-11-17 21:25:34
【问题描述】:

我目前正在学习 MySQL 的事务和锁定功能。

隔离级别为SERIALIZABLE 的事务与同一表上LOCKUNLOCK 语句之间的语句是否互斥执行?


编辑1:对于隔离级别为SERIALIZABLE的事务事物,是否甚至可以确定事务实际上是互斥的,还是仅仅满足没有幻读等要求?或者这两个属性是否意味着相同的行为?


编辑 2:哦,提供给定事务隔离级别的机制是否仅在两个或多个事务实际处理相同数据时才有效,以便实际发生读取现象?

【问题讨论】:

    标签: mysql sql concurrency transactions acid


    【解决方案1】:

    在 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 一样。

    【讨论】:

    • 孤立事务中的因果关系如何?如果一个事务对数据做了某些事情,而另一个会话也这样做了,但没有在事务中,是否仍然满足读取现象要求?
    • InnoDB 中的所有内容都在一个事务中,无论您是显式地开始/提交一个事务,还是依赖自动提交。在这两种情况下,它们都将遵守事务隔离。
    猜你喜欢
    • 2018-05-23
    • 2010-12-17
    • 2015-10-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-02
    • 2012-06-05
    • 2010-09-16
    • 2021-02-03
    相关资源
    最近更新 更多