0

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

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

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

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

IE:

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

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

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

谢谢

4

1 回答 1

1

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

您需要同时使用两者。

Transaction do
 row.lock
 update row
end

看看,如果行级锁定可以让你更容易。

于 2011-11-16T05:45:25.080 回答