Luk*_*kas 3 sql innodb transactions unique-key mariadb
我正在编写一个程序,它将数据插入到 MariaDB 服务器中,并且可以由不同的人同时使用。事务需要一些时间,因此可能会出现以下问题:人员 A 使用主键“c”启动事务,而当该事务尚未提交时,人员 B 想要插入具有相同主键“c”的数据。如何防止 B 使用 A 已在其未提交事务中使用的主键来启动其事务?
我使用 MariaDB 作为数据库,InnoDB 作为引擎。
我已经检查了隔离级别,但不知道如何使用它们来解决我的问题。
谢谢!
它与事务隔离级别无关。这是关于锁定。
对索引中特定条目的任何插入/更新/删除都会锁定该条目。锁遵循先到先得的原则。尝试对同一索引条目执行插入/更新/删除的下一个会话将被阻止。
你可以自己演示一下。并排打开两个 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)