【发布时间】:2014-05-31 15:00:09
【问题描述】:
我正在开发一个使用 MySQL 数据库作为后端的项目(从 PHP 访问)。有时,我选择一行,对其进行一些操作,然后更新数据库中的记录。
我担心另一个用户可能会在第一次选择后立即在同一行上启动类似的过程,并且他的更改可能会覆盖第一个用户所做的一些更改(因为第二个用户的选择尚未包含这些更改)。
这是一个实际问题吗?我应该锁定表吗?这不会严重影响我的应用程序的性能吗?还有其他解决方案吗?
为了全面了解我的信息,我还运行了一些 CRON 作业,这些作业也可能在修改相同的数据。
谢谢!
【问题讨论】:
-
使用事务,确保您使用的是符合 ACID 的引擎
-
感谢您的建议。所以基本上,我只是将引擎设置为 InnoDB,然后在我选择之前执行“START TRANSACTION”,然后在我更新之后执行“COMMIT”?还有什么我需要考虑的吗,或者是这样吗?
-
如果您在事务中更新多个表。尝试在事务中以相同的顺序访问您正在更新的表。这减少了死锁的机会。
-
解决行在您检查时可能被其他用户更新的问题。考虑在事务开始时对您可能更改的行执行“选择更新”。即使您不更新它们,您也可以确定在使用它们时它们不会被更改。
标签: php mysql sql table-locking table-lock