3

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

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 -> 提交

人1 [!错误]

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

person1 将触发回滚,那 person 2 已经运行的查询会发生什么?

4

2 回答 2

1

事务旨在是原子的,也就是说,任何给定的进程都将看到一个事务的所有内容,或者一个也没有。那么,在您的示例中,person1 的事务中的错误不会出现在 person2 中,回滚也不会影响 person2 的操作。

但是,有一些警告。例如,原子性仅在非混合表类型以及表引擎支持的地方得到保证。MySQL 网站上提供了完整的详细信息

于 2013-08-02T01:52:02.653 回答
0

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

于 2013-08-02T01:49:35.710 回答