同时交易会相互干扰吗? PHP / MySQL的

时间:2013-08-02 01:42:13

标签: php mysql transactions

所以我找到了这个示例代码,并计划为我的一个项目做类似的事情,但有一个问题就是困扰我

try {
    // First of all, let's begin a transaction
    $db->beginTransaction();

    // A set of queries; if one fails, an exception should be thrown
    $db->query('first query');
    $db->query('second query');
    $db->query('third query');

    // If we arrive here, it means that no exception was thrown
    // i.e. no query has failed, and we can commit the transaction
    $db->commit();
} catch (Exception $e) {
    // An exception has been thrown
    // We must rollback the transaction
    $db->rollback();
}

前端使用一个mysql用户(比如说'webaccess-admin''密码')来连接到数据库,那么如果两个人一次运行代码会发生什么情况,而其中一个代码失败呢?如果php脚本的一个实例的执行错误导致该脚本的另一个实例的sql查询也回滚?我必须使用命名交易吗?或单独的mysql用户?

这是我正在谈论的一个例子:

person1 - >开始交易

person2 - >开始交易

//两个用户执行的sql代码

person1 - >提交

person1 [!错误]

person2 - >仍在运行查询(或者现在可能已提交)

person1会触发回滚,第2个人运行的查询会发生什么?

2 个答案:

答案 0 :(得分:1)

事务是原子的,也就是说,任何给定的进程都会看到所有事务,或者没有任何事务。在您的示例中,person1的事务中的错误不会出现在person2中,回滚也不会影响person2的行为。

然而,有一些警告。例如,只保证非混合表类型的原子性,以及表引擎支持它的原子性。有关详细信息,请参阅MySQL site

答案 1 :(得分:0)

这完全取决于数据库连接使用的事务隔离。有了php,我很确定他们根本不会干涉。通过UPDATE和INSERT语句对数据库进行更改时,它们通常在提交事务之前不会生效。