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)
现在,我的问题是关于以下场景:
事务中是否有任何隐式锁定,或者我是否需要明确锁定表 A 以便在我提交更改之前没有人可以在表 A 中插入任何数据?
在可重复读取中,始终存在通过gen_clust_index (又名聚集索引)施加的行级锁定。这就是交易的美妙之处。更有趣的是,InnoDB 有四种事务隔离级别,而不仅仅是一种:
您可以设置 tx_isolation 的四个值:
在您的特定情况下,将数据插入 TableA 实际上不会写入磁盘。必要的更改记录在三 (3) 个不同的位置:
这同样适用于步骤 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)
试一试 !!!
当每个人都在使用可重复读取时
注意:表级锁定对于 InnoDB 来说从来都不是隐式的。如果要锁定表,则必须LOCK TABLE显式发出。