【问题标题】:MySQL / PHP transaction behaviorMySQL/PHP 事务行为
【发布时间】:2010-01-18 16:09:27
【问题描述】:

给定:

mysql_query("START TRANSACTION");
mysql_query("UPDATE foo = 'bar'");
die();

die() 在我可以COMMITROLLBACK 之前停止交易。查看我的表,似乎更新没有发生,但如果我稍后在另一个脚本中运行查询,它们是否仍然是初始事务的一部分?在我 COMMITROLLBACK 之前,交易是否仍然“开放”?

【问题讨论】:

    标签: php mysql transactions


    【解决方案1】:

    如果 die 终止了与 mysql 的连接,那么是的,事务被关闭。如果你只是让交易挂起,虽然你会遇到麻烦。

    我建议确保事务和提交在同一个 mysql_query 中,如果可以的话,以确保它确实发生。

    【讨论】:

    • 根据php.net/manual/en/function.mysql-close.php:“通常不需要使用 mysql_close(),因为非持久打开的链接会在脚本执行结束时自动关闭。”由于 die() 结束了脚本的执行,我认为这意味着数据库连接已关闭?
    • 不幸的是,我没有使用 mysqli,所以我不能一次执行多个查询。
    • 没错,我只是想知道您是否真的会完全忠实于在交易打开后总是死()ing。我的意思是,在现实生活中,你真的会死多少次?这就是为什么我提到你可能不应该依赖 die() 来为你关闭交易。
    【解决方案2】:

    这取决于您的序列化级别。如果一个事务既没有提交也没有回滚,它应该在一段时间后超时并在数据库中回滚。但在此之前,它是一个未完成的事务,可能会导致其他不可序列化事务中的选择不一致。依赖于它的level:

    • 读取未提交:可以读取未提交、未完成的值,直到回滚
    • 可重复读取(mysql 默认):您不会读取未提交的值,但由于范围未锁定,因此 SELECT COUNT(*) FROM customers WHERE 18

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-15
      • 1970-01-01
      • 2012-10-28
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多