在 InnoDB 中,事务是否暗示表的任何隐式锁定?

Sal*_*irk 5 mysql innodb transaction locking

隔离级别为 REPEATABLE_READ。

逻辑如下:

Transaction begins
Read data from Table A
If (Table A has Any Data) End Transaction and exit
If Table A has No Data, Proceed further
Delete a record in Table B
Transaction ends
Run Code Online (Sandbox Code Playgroud)

现在,我的问题是关于以下场景:

  • 当前执行到达点#4。
  • 我有人在表 A 中插入数据(注意,当前执行是在点 #4),它会在 #2 中返回一些结果。
  • 现在,当前执行将执行 #5。它将删除不应删除的记录。

事务中是否有任何隐式锁定,或者我是否需要明确锁定表 A 以便在我提交更改之前没有人可以在表 A 中插入任何数据?

Rol*_*DBA 3

在可重复读取中,始终存在通过gen_clust_index (又名聚集索引)施加的行级锁定。这就是交易的美妙之处。更有趣的是,InnoDB 有四种事务隔离级别,而不仅仅是一种:

您可以设置 tx_isolation 的四个值:

在您的特定情况下,将数据插入 TableA 实际上不会写入磁盘。必要的更改记录在三 (3) 个不同的位置:

  1. 内存中的日志缓冲区
  2. 在 ibdata1 中
    • 撤消表空间
    • 回滚段
    • 双写缓冲区
  3. ib_logfile0 或 ib_logfile1 中的重做日志信息

这同样适用于步骤 5 中的删除。

执行回滚将撤消删除,然后撤消插入。

你必须记住一些非常重要的事情:如果你想回滚多个SQL命令,你必须像这样开始:

SET autocommit = 0;
START TRANSACTION;

Transaction begins
Read data from Table A
If (Table A has Any Data) End Transaction (via ROLLBACK) and exit
If Table A has No Data, Proceed further
Delete a record in Table B
Transaction ends

COMMIT;
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

当每个人都在使用可重复读取时

  • 您的 INSERT 只有您自己能看到
  • 别人的 DELETE 只有对方看到

注意:表级锁定对于 InnoDB 来说从来都不是隐式的。如果要锁定表,则必须LOCK TABLE显式发出。