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

标签 sql transactions mariadb innodb unique-key

我正在编写一个将数据插入 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/

相关文章:

Mysql错误分隔符: Error at Line Delimiter

php - 多行的内部连接

mysql - 如何只更新 DB2 中的一条记录?

MySQL余额计算-每次都单独的表或查询来计算?

mysql - 与 phpmyadmin 相比,$wpdb->get_results 查询返回不同(错误)的结果

php - 如何将一些数据添加到 mysql 结果集中?

java - 如何使用 concat 函数表示 JPA 标准中的空格字符

sql - 如果给定日期时间,则获取前 12 个月的日期

sql - SQL JOIN 查询中的重复条目

java - Spring Transactional 减慢了整个过程