我有一个表正在收集用户输入的数据。
我想执行以下SQL语句:
SELECT语句1
SELECT语句2
我在2个选择语句中读出的UPDATE表行
我想防止其他用户在任何语句之间输入新数据的可能性。
我已经阅读了MySQL手册,似乎我可以先锁定表格,但我对交易比较熟悉,我想知道围绕3个语句包装事务是否会实现我想要。我发现很难确定这可以通过阅读手册(或者它只是我......)来实现。
答案 0 :(得分:2)
这里有两个可能的问题范围;事务(如果您正在使用支持事务的引擎,如InnoDB)将解决其中一个。
事务在启动事务时保持所有查询在数据库状态的快照上运行,并且在事务完成时全部或全部应用任何修改。这有效地解决了查询的交错和竞争条件。
但是,您声明要阻止用户在任何语句之间输入新数据。如果您希望确保提交请求的用户从当前数据开始,您需要实现自己的锁定机制,或者至少是一种方法来捕获请求之间的交错导致问题的情况。
基本上,事务只会帮助在并发请求中运行的查询。如果这种情况会出现问题:
如果User2能够在不知道User1所做的更改的情况下提交更改,则需要您自己的锁定系统;交易无济于事。这来自Web开发背景,其中每个步骤都是单独事务中的单独Web请求。