1

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

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

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

如果进程终止,有没有办法确保记录被删除?

4

1 回答 1

2

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

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

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

如果守护进程崩溃,事务就会中止并且记录会消失。如果成功,它可以在数据库中将其标记为完成或删除记录等,然后提交。这真的很好,因为如果守护进程因任何原因失败,它所做的所有更改都会被反转并且可以重试。

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

事务隔离级别参考

请注意,这一切都需要 InnoDB 或任何好的事务数据库。

于 2012-06-08T22:57:22.847 回答