2010-01-18 52 views
4

考虑:的MySQL/PHP的交易行为

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

die()之前,我可以COMMITROLLBACK停止交易。看看我的表,看起来更新不会发生,但如果我稍后在另一个脚本中运行查询,他们仍然是该初始事务的一部分吗?直到我COMMITROLLBACK交易仍然“开放”?

回答

4

如果死亡连接到mysql然后是,交易是关闭的。如果你刚刚离开交易挂起,但你会遇到麻烦。

我会建议确保事务和提交在相同的mysql_query中,如果在所有人类可能的情况下确保它实际发生。

+0

返回一致的值根据http://www.php.net/manual/en/function.mysql-close客户.php: “通常不需要使用mysql_close(),因为在脚本执行结束时,非持久性的打开链接会自动关闭。“ 由于die()结束脚本的执行,我会假设这意味着数据库连接已关闭? – Matthew 2010-01-18 16:24:11

+0

不幸的是,我没有使用mysqli,所以我不能一次做多个查询。 – Matthew 2010-01-18 16:45:49

+0

这是正确的,我只是想知道你是否真的会彻底忠实于你的交易被打开后总是死去。我的意思是,你真的会在真实生活场景中死去多久?这就是为什么我提到你可能不应该依靠die()来为你关闭交易。 – 2010-01-19 05:55:31

1

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

  • 读取未提交:您可以读取未提交的,未完成的值,直到回滚
  • 重复读(MySQL的默认):你不会读未提交值,但范围没有被锁定,一个SELECT COUNT(*)FROM WHERE 18 <年龄和< 24岁,不能保证到回滚