单个InnoDB表上的多个事务可能吗?

时间:2016-09-12 14:04:38

标签: php mysql sql transactions

这是关于SQL的问题,但目的是创建一个php脚本。

CONTEXT

假设我有一个包含2个表的数据库(在InnoDB引擎上设置):

  • 用户

现在有2个用户访问我的应用程序(在php中),并且都启动了一个执行以下算法的网页:

  1. 打开连接
  2. 开启交易
  3. 在表格用户
  4. 中插入新行
  5. 提交交易
  6. 问题

    SQL可以在同一个表上处理2个事务吗?

    PhP代码(备案)

    $host = 'localhost';
    $database = 'user';
    $user = 'root';
    $password = '';
    $encode = 'utf8';
    $dsn = "mysql:host=$host;dbname=$database;charset=$encode";
    $pdo = null;
    
    try {
        $pdo = new PDO($dsn, $user, $password);
        $query = "INSERT INTO user (name, city) VALUES ('test', 'Paris')";
        $pdo->beginTransaction();
    
        if( $pdo->inTransaction() ) {
            // Can I still launch the query ?
        }
        else {
            // Or should I stop here ?
        }
    
        if( $pdo->query( $query ) ) {
            $pdo->commit();
        }
        else {
            $pdo->rollBack();
        }   
    }
    catch( PDOException $e ) {
        print_r($pdo->errorInfo());
    }
    

2 个答案:

答案 0 :(得分:2)

正确,您可以在事务中执行多个查询。这实际上是使用交易的重点。

In PDO, from the documentation,只要您通过调用PDO::beginTransaction()启动了一个事务,您就可以执行多个查询,并且在您完成之前,任何人都看不到更改(即通过调用{{ 1}})。

  

您不仅限于在交易中进行更新;您还可以发出复杂​​的查询来提取数据,并可能使用该信息来构建更多的更新和查询;当交易处于活动状态时,您可以保证在您工作的过程中没有其他人可以进行更改。有关事务的进一步阅读,请参阅数据库服务器提供的文档。

在MySQL中使用InnoDB引擎,具体来说,你有行级粒度,这意味着只有行被锁定,而不是像(较旧的)MyISAM引擎那样整个表。

答案 1 :(得分:1)

如果你正在使用InnoDB引擎,你可以在MySQL中打开任意数量的事务。每个开放交易的成本都很低,这通常是一个边际问题,除非您正在处理一个被写活动淹没的表格。随着事务处理数量的增加,MySQL越难维护各种不完整的版本。

如果你想更多地了解MySQL处理事务的方式,可以在huge section on it in the manual讨论MVCC(多版本并发控制)的含义。

如果您有多个操作要进行 atomic ,那么事务才真正相关,即所有查询都成功或者全部失败。在您的示例中,您有一个语句,根据定义原子。将它包装在事务块中会带来更多的开销,而这些开销并没有真正为您提供任何您已经拥有的开销。