首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个InnoDB表上可能有多个事务?

问一个InnoDB表上可能有多个事务?
EN

Stack Overflow用户
提问于 2016-09-12 14:04:38
回答 2查看 1.5K关注 0票数 2

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

上下文

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

  • 用户
  • 购物车

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

  1. 打开连接
  2. 开启交易
  3. 在表用户中插入新行
  4. 提交事务

问题

SQL能否处理同一表上的2个事务?

PhP代码(用于记录)

代码语言:javascript
复制
$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());
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-12 14:22:35

正确,您可以在事务中执行多个查询。这实际上就是使用事务的意义所在。

在PDO中,来自文档,只要您已经通过调用PDO::beginTransaction()启动了一个事务,您就可以执行多个查询,并且在您完成之前,其他任何人都不会看到这些更改(即通过调用PDO::commit())。

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

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

票数 2
EN

Stack Overflow用户

发布于 2016-09-12 14:22:26

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

如果您想了解更多关于MySQL如何处理事务的信息,那么就会有一个手册中关于它的重要章节来讨论MVCC (多版本并发控制)的含义。

只有当您有多个要创建原子的操作时,事务才是真正相关的,也就是说,所有的查询都成功了,或者它们都失败了。在这里的示例中,您有一个语句,根据定义,它是原子的。将其封装在事务块中会带来更多的开销,这些开销实际上不会给您带来任何您尚未拥有的东西。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39452236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档