我正在编写一个将数据插入 MariaDB 服务器的程序,并且可以同时供不同的人使用。事务需要一些时间,因此可能会出现以下问题:A 以主键“c”开始事务,而事务尚未提交时,B 想插入具有相同主键“c”的数据。如何防止 B 使用 A 已在其未提交事务中使用的主键开始其事务?
我使用 MariaDB 作为数据库,使用 InnoDB 作为引擎。
我检查了隔离级别,但不知道如何使用它们来解决我的问题。
谢谢!
最佳答案
它与事务隔离级别无关。这是关于锁定。
对索引中特定条目的任何插入/更新/删除都会锁定该条目。锁被授予先到先得。尝试对同一索引条目执行插入/更新/删除的下一个 session 将被阻止。
您可以自己演示。并排打开两个 MySQL 客户端窗口。
第一个窗口:
mysql> START TRANSACTION;
mysql> INSERT INTO mytable SET c = 42;
那就不要提交了。
第二个窗口:
mysql> INSERT INTO mytable SET c = 42;
注意它此时挂起,等待锁定。
第一个窗口:
mysql> commit;
第二个窗口终于返回:
ERROR 1062 (23000): Duplicate entry '42' for key 'PRIMARY'
关于sql - 如何知道未提交的事务是否试图将特定的唯一键插入 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57638291/