Mysql 多连接与原子更新 sql 查询 [竞争条件]

Posted

技术标签:

【中文标题】Mysql 多连接与原子更新 sql 查询 [竞争条件]【英文标题】:Mysql multi connections with atomic update sql queries [Race condition] 【发布时间】:2021-11-11 07:02:02 【问题描述】:

我目前正在 nodejs 中的一个项目中工作,该项目与 mysql DB 有一个池连接(同时打开了大约 10 个连接)。 现在我希望能够像这样通过连接更新数据库中的表:

update table set tries=tries+1 where condition=value;

我的问题是,这种方法的所有连接之间不可能存在竞争条件吗? 因为我在网上查了一下,发现我的 SQL 中的“事务”会导致多数据库连接之间的竞争条件。

谢谢

【问题讨论】:

请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。 【参考方案1】:

将事务的隔离级别设为可序列化。在更新的情况下,使用乐观锁定。将这些写在 StoredProcedure 中。

DECLARE V_ERR_OCCURED   BOOLEAN;
DECLARE V_ERR_MESSAGE   VARCHAR(500);

SET V_ERR_OCCURED=FALSE;
SET V_ERR_MESSAGE=SPACE(0);

SET V_ERR_MESSAGE='Transaction Error';

BEGIN

DECLARE EXIT HANDLER FOR SQLEXCEPTION
SET V_ERR_OCCURED=TRUE;

SET AUTOCOMMIT=0;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;

# Your Update Statements

IF V_ERR_OCCURED=TRUE THEN
    ROLLBACK;
ELSE
    COMMIT;
END IF;

SET AUTOCOMMIT=1;

END;

【讨论】:

以上是关于Mysql 多连接与原子更新 sql 查询 [竞争条件]的主要内容,如果未能解决你的问题,请参考以下文章

MySQL--5子查询与连接小结

Mysql查询详解(条件查询、子查询、模糊查询、连接查询。。。)

针对标签上的多对多连接优化 MySQL 查询

Linux 并发与竞争(原子操作自旋锁信号量互斥体)

并发与竞争

MySQL数据库多表查询