PHP/MySQL : Insert rows temporarily

标签 php mysql rows temporary

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

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

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

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

最佳答案

这是一个有趣的问题,我实际上在几年前为一门大学类(class)实现了它。

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

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

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

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

Transaction isolation levels reference

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

关于PHP/MySQL : Insert rows temporarily,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10956837/

相关文章:

php - Apache 2.4错误: FCGI: attempt to connect to Unix domain socket/run/php/php7. 0-fpm.sock(*)失败

MySQL根据同一表中的一列中的条件合并属于同一ID的表中的行

php - 使用 Php 从 Mysql 获取用户评论

javascript - 使用 JavaScript 循环数据以创建包含键/值对的字典

重命名 R 中的行和列

php - 由 MySQL 数据决定的倒计时器

php - 如何将数组拉入 PHP MySQL 输出?

php - 循环中的查询是否可能给出不同的结果?

php - Where 子句似乎不起作用

mysql - 查找两行之间的最大差异