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 查询 [竞争条件]的主要内容,如果未能解决你的问题,请参考以下文章