4

我有一个表格,正在收集用户输入的数据。

我要执行以下 SQL 语句:

选择语句 1

选择语句 2

更新我在 2 个选择语句中读出的表行

我想防止另一个用户在任何语句之间输入新数据的可能性。

我已经阅读了 MySQL 手册,似乎我可以先锁定表,但我更熟悉事务,我想知道围绕 3 个语句包装事务是否可以实现我想要的。我发现很难通过阅读手册来确定这是否有效(或者也许只是我......)

4

1 回答 1

2

这里有两个可能的问题范围;事务(如果您使用支持事务的引擎,例如 InnoDB)将解决其中一个问题。

事务使您的所有查询在事务启动时都在数据库状态的快照上运行,并且在事务完成时应用全部或不应用任何修改。这有效地解决了查询的交错和竞争条件。

但是,您声明要防止用户在任何语句之间输入新数据。如果在这种情况下,您希望确保提交请求的用户是从当前数据开始的,那么您需要实现自己的锁定机制,或者至少有一种方法可以捕获请求之间的交错导致问题的情况。

基本上,事务只会对在并发请求中运行的查询有所帮助。如果这种情况有问题:

  1. User1 请求数据
  2. User2 请求数据
  3. User1 提交修改
  4. User2 提交修改

如果 User2 能够在不知道 User1 所做的更改的情况下提交更改,则您需要自己的锁定系统;交易不会有帮助。这来自 Web 开发背景,其中每个步骤都是单独事务中的单独 Web 请求。

于 2013-03-17T22:04:36.543 回答