PHP / MySQL:临时插入行

时间:2012-06-08 22:42:21

标签: php mysql rows temporary

我正在研究用PHP和Mysqli编写的复杂数据库应用程序。对于大型数据库操作,我使用在后台工作的守护进程(也是PHP)。在这些可能需要几分钟的操作期间,我想阻止用户访问受影响的数据并向他们显示消息。

我考虑过创建一个Mysql表,并在每次进行特定的守护进程操作时插入一行。然后,我总是能够在尝试访问数据时检查是否发生了某个操作。

然而,当然重要的是记录不会留在数据库中,如果守护程序进程因任何原因而终止(从控制台中删除,丢失数据库连接,拔掉插头等)我不认为Mysql事务/回滚能够执行此操作,因为必须提交才能将更改公开,并且如果终止,记录将保留在数据库中。

有没有办法确保在进程终止时删除记录?

1 个答案:

答案 0 :(得分:2)

这是一个有趣的问题,几年前我实际上是为大学课程实现的。

我使用的技巧是使用事务隔离。如果您的守护进程创建指示它们正在进行但不提交它的记录,那么您说其他客户端将不会看到该记录是正确的。但是,如果您将该客户端的隔离级别设置为READ UNCOMMITTED,您将看到记录说它正在进行中 - 因为READ UNCOMMITTED将向您显示尚未提交的其他客户端的更改。 (守护程序将保留默认的隔离级别)。

您应该将客户端的隔离级别设置为仅为该守护程序检查读取未提交,而不是因为它可能非常危险,因此不会用于其他工作。

如果守护程序崩溃,则事务将中止并且记录将继续。如果成功,它可以在db中标记它或删除记录等,然后提交。 这非常好,因为如果守护进程因任何原因失败,它所做的所有更改都会被撤消,并且可以重试。

如果您需要更多解释或代码,我可以在某处找到我的作业:)

Transaction isolation levels reference

请注意,这一切都需要InnoDB或任何良好的事务DB。