MySQL 事务和并发插入

标签 mysql concurrency insert transactions isolation

我得到了某人制作的这个脚本,我查看了它并发现了一些我不确定是否安全的内容:

在一个事务内,有 2 个连续的插入,位于 2 个不同的表中,两个表都具有自动递增的主键。它们应该是相同的(第一次插入生成的主键 = 第二次插入生成的主键)。

别问我为什么,剧本就是这么写的。

我是事务新手,我不太清楚这里是否存在并发问题。我正在考虑另一个线程同时运行并最终生成如下 key 的可能性:

Thread #1:    Table_A ID: 3                                        Table_B ID: 4
Thread #2:                      Table_A ID: 4     Table_B ID: 3

我很确定(我今天才第一次准备好与交易相关的文档)交易无法防止这种情况,但我只是想确保我做对了。

谢谢!

最佳答案

您需要将两个连接置于可序列化事务隔离级别,以避免出现您所描述的情况,方法是在每个连接上设置 tx_isolation:

SET @@tx_isolation = SERIALIZABLE;

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

或者通过设置全局隔离级别:

SET @@global.tx_isolation = SERIALIZABLE;

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;

由任何随后打开的连接继承。在该级别,如果另一个事务已经在进行中,则事务将阻塞任何查询,即。事务已在同一表上发出查询(读或写)。

参见the mysql documentation了解更多详情。

关于MySQL 事务和并发插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16041664/

相关文章:

mysql - 如何从 MySQL 中随机选择行进行分页?

Java CompletableFuture.anyOf(manyfutures).thenRun( runnable ) 只运行一次

sql-server - 管理 SQL Server 中的并发

c++ - 在键值内的无序映射中插入字符对值

MySQL 使用 = 无法正确匹配电子邮件地址,但可以使用 LIKE

javascript - 获取经纬度html js

sql-server - 存储过程是否锁定表/行?

javascript - 在 Javascript 函数中使用 last_insert_row() 与在数据库查询工具中使用时有何区别?

mysql - MyISAM Selects 锁仅在过程内部插入

PHP |搜索攻击的用户和漏洞