事务是不是会停止 MySQL 中的所有竞争条件问题?

     2023-03-06     61

关键词:

【中文标题】事务是不是会停止 MySQL 中的所有竞争条件问题?【英文标题】:Does a transaction stop all race condition problems in MySQL?事务是否会停止 MySQL 中的所有竞争条件问题? 【发布时间】:2010-05-11 07:29:35 【问题描述】:

考虑这种情况:

    开始交易 使用 auto_increment 键将 20 条记录插入表中 获取第一个插入ID(假设它是153) 更新该表中id >= 153 所在的所有记录 提交

第 4 步安全吗?

也就是说,如果另一个请求几乎同时到来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?

【问题讨论】:

为什么你会有一个单独的更新步骤,而不是一开始就插入正确的数据?那是相当奇怪的。如果您首先插入正确的数据,则无需担心“竞争条件”。更新WHERE id > 153 也是一个很奇怪的查询。自动增量 id 对它们没有逻辑,因此您永远不应该(据我所知)仅基于 id 进行更新。最后,我不知道任何“第一个插入 id”功能。 @ButtleButkus dev.mysql.com/doc/refman/5.0/en/… "如果您使用单个 INSERT 语句插入多行,LAST_INSERT_ID() 将返回为第一个插入行生成的值" 你对 LAST_INSERT_ID() 的看法是对的,但这并没有改变这样一个事实,即问题似乎是关于假设情况,如果遵循基本的数据库结构和过程,这种情况永远不会存在。为什么您的更新标准永远是无意义的 id 的值?我想不出任何理由。我不会称其为“竞争条件”,因为它是荒谬的。当您可以插入正确的值开始时,为什么要在插入后立即更新?这些才是这个问题没有意义的真正原因。 我真的不记得最初的问题(大约 3 年前),但我认为这是必要的。 :) 不管推理如何,我相信这个问题的基本原则是合法的——在该事务中,在插入插入期间插入的记录是否可以“看到”并受到更新的影响? 【参考方案1】:

也就是说,如果另一个请求几乎同时到来,并且在上面的第 2 步之后,但在第 4 步之前,又插入了 20 条记录,会不会出现竞态条件?

是的,会的。

2140 的记录将被2 事务锁定。

事务1 将被阻塞并等待事务2 提交或回滚。

如果事务2 提交,那么事务1 将更新40 记录(包括由事务2 插入的记录)

【讨论】:

你能澄清一下吗?你是说有问题还是没有?【参考方案2】:

我认为这不能归类为竞争条件,而是归类为 DMBS 特定行为。基本上,如果 DBMS 锁定了新插入的记录,那么在提交第二个事务之前,第一个事务将不会看到来自第二个事务的记录。

当然还有锁定表的问题,如果第一个事务对表进行写锁定,那么第二个事务将在写入时被阻塞,直到第一个事务完成。不确定标准 mysql 是否提供这种功能。我知道 MSSQL 服务器确实如此。

【讨论】:

处理事务数据库表中的竞争条件

】处理事务数据库表中的竞争条件【英文标题】:Dealingwithraceconditionintransactionaldatabasetable【发布时间】:2014-10-0712:08:48【问题描述】:让我先介绍一下场景。假设您有一个用于业务应用程序的数据库,并且它跟踪的内容之一是... 查看详情

停止刷新令牌的竞争条件?

】停止刷新令牌的竞争条件?【英文标题】:StopRaceConditionofRefreshToken?【发布时间】:2019-09-2815:44:19【问题描述】:我有一个reactjs站点和asp.net核心后端,但刷新令牌有问题。当有人登录我的网站时,他们会获得访问令牌和刷新... 查看详情

使用数据库事务防止竞争条件 (Laravel)

】使用数据库事务防止竞争条件(Laravel)【英文标题】:PreventingRaceConditionsUsingDatabaseTransactions(Laravel)【发布时间】:2017-07-2410:23:39【问题描述】:如何防止发生这种竞争情况?我知道Laravel中的事务正在阻止更新,但是如何防止使... 查看详情

嵌入式锁是不是会针对竞争条件增加任何价值?

】嵌入式锁是不是会针对竞争条件增加任何价值?【英文标题】:Doembeddedlocksaddanyvalueagainstraceconditions?嵌入式锁是否会针对竞争条件增加任何价值?【发布时间】:2021-04-2607:40:21【问题描述】:我最近在我的代码中遇到了一些竞... 查看详情

此 UPDATE 语句中是不是存在可能的竞争条件?

】此UPDATE语句中是不是存在可能的竞争条件?【英文标题】:IsthereapossibleraceconditioninthisUPDATEstatement?此UPDATE语句中是否存在可能的竞争条件?【发布时间】:2011-04-2902:39:12【问题描述】:我正在编写一个同步器软件,它将获取一... 查看详情

NHibernate 事务和竞争条件

】NHibernate事务和竞争条件【英文标题】:NHibernatetransactionandracecondition【发布时间】:2008-09-2308:08:22【问题描述】:我有一个ASP.NET应用程序,它使用NHibernate在用户操作时以事务方式更新一些表。涉及一个日期范围,因此只能在... 查看详情

函数中的 SELECT 或 INSERT 是不是容易出现竞争条件?

】函数中的SELECT或INSERT是不是容易出现竞争条件?【英文标题】:IsSELECTorINSERTinafunctionpronetoraceconditions?函数中的SELECT或INSERT是否容易出现竞争条件?【发布时间】:2013-04-0302:58:28【问题描述】:我写了一个函数来为一个简单的... 查看详情

mysql事务死锁

】mysql事务死锁【英文标题】:mysqltransactiondeadlock【发布时间】:2011-03-1815:06:52【问题描述】:我不时收到由竞争条件引起的mysql死锁错误。我已经设法用以下方法复制了错误。交易1开始交易插入fixtradeshistory(selectnull,fixtrades.*from... 查看详情

Java MySQL 防止竞争条件

】JavaMySQL防止竞争条件【英文标题】:JavaMySQLpreventracecondition【发布时间】:2016-03-2122:01:27【问题描述】:我编写了一个java应用程序,它启动异步线程以从同一个数据库读取和更新值。每个线程都从连接池(c3p0)中获取连接。我必... 查看详情

为啥“删除”这个无锁堆栈类中的节点会导致竞争条件?

】为啥“删除”这个无锁堆栈类中的节点会导致竞争条件?【英文标题】:Whywould\'deleting\'nodesinthislock-freestackclasswouldcauseracecondition?为什么“删除”这个无锁堆栈类中的节点会导致竞争条件?【发布时间】:2016-09-1618:37:51【问题... 查看详情

mysql简单介绍——换个角度认识mysql

...>=5.5默认的存储引擎,MySQL推荐使用的存储引擎。支持事务,行级锁定,外键约束。事务安全型存储引擎。更加注重数据的完整性和安全性。存储格式:数据,索引集中存储,存储于同一个表空间文件中。InnoDB的行锁模式及其加... 查看详情

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

...布时间】:2021-11-1107:02:02【问题描述】:我目前正在nodejs中的一个项目中工作,该项目与MysqlDB有一个池连接(同时打开了大约10个连接)。现在我希望能够像这样通过连接更新数据库中的表:updatetablesettrie 查看详情

原子对象是不是受到保护免受竞争条件的影响?

】原子对象是不是受到保护免受竞争条件的影响?【英文标题】:Areatomicobjectsprotectedagainstraceconditions?原子对象是否受到保护免受竞争条件的影响?【发布时间】:2019-03-0213:03:41【问题描述】:据我所知,他们不是。原子对象没... 查看详情

Python是不是检查多条件if语句中的所有条件? [复制]

】Python是不是检查多条件if语句中的所有条件?[复制]【英文标题】:DoesPythonCheckALLconditionsinanmulti-conditionifstatement?[duplicate]Python是否检查多条件if语句中的所有条件?[复制]【发布时间】:2020-01-1516:15:45【问题描述】:我很好奇如... 查看详情

MySql 条件停止脚本执行

】MySql条件停止脚本执行【英文标题】:MySqlconditionalstopscriptexecution【发布时间】:2016-11-1410:24:09【问题描述】:我需要编写SQL脚本,如果在DB中找不到某些值,该脚本就会停止。像这样的东西(伪代码):BEGIN;...set@a=(select...);if@... 查看详情

JavaScript 中的竞争条件与复合赋值

】JavaScript中的竞争条件与复合赋值【英文标题】:RaceconditioninJavaScriptwithcompoundassignment【发布时间】:2017-11-0409:35:52【问题描述】:我不是在谈论复杂的比赛条件involvingthenetwork或events。相反,我似乎发现+=运算符在V8(Chrome58或No... 查看详情

mysql学习笔记-事务(代码片段)

事务事务:是一组操作的集合,是一个不可分割的工作单位,事务会把所有操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败(当操作中某一步出现异常时,前面已执行的步骤也会失效)... 查看详情

Haskell - 延迟评估是不是会导致此文件夹停止评估所有功能

】Haskell-延迟评估是不是会导致此文件夹停止评估所有功能【英文标题】:Haskell-WilllazyevaluationcausethisfoldrtostopevaulatingallfunctionsHaskell-延迟评估是否会导致此文件夹停止评估所有功能【发布时间】:2020-01-2300:37:50【问题描述】:fun... 查看详情