MySQL / PHP事务行为

时间:2010-01-18 16:09:28

标签: php mysql transactions

假设:

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

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

2 个答案:

答案 0 :(得分:4)

如果die终止了与mysql的连接,那么是,该事务将被关闭。如果你刚刚离开交易,虽然你会遇到麻烦。

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

答案 1 :(得分:1)

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

  • read uncommitted:您可以读取未提交的未完成值,直到回滚
  • 可重复读取(默认为mysql):您不会读取未提交的值,但由于范围未锁定,因此SELECT COUNT(*)FROM customers WHERE 18&lt;年龄和年龄< 24不保证在回滚之前返回一致的值