MySQL事务与锁定

MySQL事务与锁定,mysql,zend-framework,transactions,rowlocking,Mysql,Zend Framework,Transactions,Rowlocking,此处需要快速提问/澄清。我有一个DB表,它很可能同时更新一条记录。我在应用程序中使用Zend Framework,我已经读到了避免这种情况的两个方向,首先是表锁定(LOCK TABLES test WRITE)或类似的东西,如果这是最好的解决方案,我将返回并重新阅读如何准确地执行。第二个是事务:$db->beginTransaction()$db->commit() 现在“假设”我使用的是事务存储引擎,如InnoDB,事务似乎是更常见的解决方案。但是,这是否避免了以下情况: 用户A在网页->提交

此处需要快速提问/澄清。我有一个DB表,它很可能同时更新一条记录。我在应用程序中使用Zend Framework,我已经读到了避免这种情况的两个方向,首先是表锁定(LOCK TABLES test WRITE)或类似的东西,如果这是最好的解决方案,我将返回并重新阅读如何准确地执行。第二个是事务:$db->beginTransaction()$db->commit()

现在“假设”我使用的是事务存储引擎,如InnoDB,事务似乎是更常见的解决方案。但是,这是否避免了以下情况:

用户A在网页->提交数据->开始事务->读取行->计算新值->更新行->保存->提交

用户B同时在同一个网页上并提交数据,现在让我们说它几乎是同时提交的(用户B在用户a的事务的开始事务和提交之间调用更新函数)用户B依赖于用户A事务中提交的数据,然后才能实现更新记录的准确计算

即:

数据库行中的期初值:5用户A提交的值为5。(开始 事务->读取值(5)->添加提交的值(5+5=10)->写入 更新值->保存->提交)

用户B提交值7。我需要确保 用户B的事务读取为10,而不是5(如果更新未完成 阅读前)

我知道这是一个冗长的解释,我很抱歉,我不完全确定正确的术语来简化这个问题


谢谢,事务不能确保锁定。事务中的整个块被视为对db的原子更新(如果在此块之前的所有更改之间出现任何故障,则回滚)。因此,两个并行运行的事务可以更新同一行

你需要两者兼用

Transaction do
 row.lock
 update row
end

请参阅,如果行级锁定可以使u变得更容易。

您是否可以通过执行类似于
更新表SET value=value+5的操作来逃脱?那么交易就没有必要了。那可以奏效,肯定会让我的生活变得轻松。我可能只会遇到一个问题。我进行更新,然后第二个会话在读取值之前进行更新,我需要将正确的值发送回原始用户。因此,它将是一个更新,然后是一个选择来检索当前的“值”。如果不希望在读取之前进行第二次更新,那么返回的结果将无效(或者我不正确)。我担心的原因是数据在更新并返回给用户时必须100%保证正确。我不认为您可以得到100%的正确。即使您确保读取了正确的值,当您将其发送给用户并释放锁时,它也可能已过期。除非您有一个接收实时数据库更新的事件驱动系统,否则不能保证您具有当前值。(即使这样,也可能会有明显的延迟。)为了准确起见,我想得越多,也许更好的解决方案是采用审计方式,即使用设置值插入记录,然后使用前一条记录读取该记录,并将前一条记录和插入的记录的总和返回给用户。我意识到“当前”值可能会更新,但这很好,只要保证计算值正确,并且所有添加项的审计历史记录也会作为一个有用的副作用提供。这会起作用。在这种情况下,您可能希望使用事务。我将接受这个答案,完全是因为它回答了我最初的问题(快速版)“事务是否会针对种族条件进行保护”,答案是否定的。我认为@MichaelMior的评论帮助我从不同的角度看待我的问题,并提供了一个更可行的解决方案。所以谢谢你们俩/和平!