【问题标题】:Could simultaneous transactions interfere with each other? php/mysql同时交易会相互干扰吗? php/mysql
【发布时间】:2013-08-02 01:42:13
【问题描述】:

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

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''password')连接到数据库,那么如果两个人同时运行代码,其中一个人失败了会发生什么?执行 php 脚本的一个实例时出错会导致该脚本的另一个实例的 sql 查询也回滚吗?我必须使用命名交易或其他东西吗?还是单独的mysql用户?

下面是我所说的一个例子:

person1 -> 开始交易

person2 -> 开始交易

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

person1 -> 提交

person1 [!error]

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

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

【问题讨论】:

    标签: php mysql transactions


    【解决方案1】:

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

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

    【讨论】:

    • 好的,即使前端的两个实例都使用相同的mysql用户名?
    • 应该没问题 - 每个连接都是独立处理的,即使它们共享相同的登录凭据。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 1970-01-01
      • 2013-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多