如何知道未提交的事务是否尝试将特定的唯一键插入 SQL 中

Luk*_*kas 3 sql innodb transactions unique-key mariadb

我正在编写一个程序,它将数据插入到 MariaDB 服务器中,并且可以由不同的人同时使用。事务需要一些时间,因此可能会出现以下问题:人员 A 使用主键“c”启动事务,而当该事务尚未提交时,人员 B 想要插入具有相同主键“c”的数据。如何防止 B 使用 A 已在其未提交事务中使用的主键来启动其事务?

我使用 MariaDB 作为数据库,InnoDB 作为引擎。

我已经检查了隔离级别,但不知道如何使用它们来解决我的问题。

谢谢!

Bil*_*win 6

它与事务隔离级别无关。这是关于锁定。

对索引中特定条目的任何插入/更新/删除都会锁定该条目。锁遵循先到先得的原则。尝试对同一索引条目执行插入/更新/删除的下一个会话将被阻止。

你可以自己演示一下。并排打开两个 MySQL 客户端窗口。

第一个窗口:

mysql> START TRANSACTION;
mysql> INSERT INTO mytable SET c = 42;
Run Code Online (Sandbox Code Playgroud)

那么先别承诺。

第二个窗口:

mysql> INSERT INTO mytable SET c = 42;
Run Code Online (Sandbox Code Playgroud)

请注意,它此时挂起,等待锁定。

第一个窗口:

mysql> commit;
Run Code Online (Sandbox Code Playgroud)

第二个窗口终于返回:

ERROR 1062 (23000): Duplicate entry '42' for key 'PRIMARY'
Run Code Online (Sandbox Code Playgroud)