2013-04-03 151 views
0

我有3个关于PDO和Transactions的查询。 我在交易中很新颖,所以请理解我的误解!PDO MySQL交易

首先,我将解释一下情况: 我创建了一个单例模式的PDO包装,它使用innoDB表访问MySQL数据库。我创建包装的原因是提供额外的功能并提高可移植性。

每次对象需要访问数据库时,它都会检索相同的连接。

我的问题如下:

1)我明白,如果我开始一个事务与PDO::beginTransaction(),那么将MySQLs自动提交模式关闭。但是,这是否影响到当前用户与数据库或每个访问者连接的连接,因为它包含自动提交值的数据库,而不是PHP脚本?

2)我需要执行与实际事务无关的MySQL查询。这些查询在不相关的对象中执行,但仍使用与事务相同的MySQL连接。 我刚刚发现与事务无关的(对于事务)查询仍然包含在事务中,这导致了不希望的影响。有没有办法解决?或者是我的PHP设计对于这种交易的使用是不正确的?

3)我正在使用PHP 5.1。它支持以下功能:PDO::beginTransaction(),PDO::commit()PDO::rollBack()

据我所知,如果我打电话PDO::rollBack(),当一个事务没有生效时,抛出一个PDOException。解决方法是在使用rollBack()之前使用PDO::inTransaction()来检查事务,但是直到5.3之前,这不会被添加到PHP。

目前,当我的包装器启动一个事务时,它将一个静态变量更新为true,当它回滚或提交时,它将该变量设置为false。这是一个好的解决方案吗?或者有没有我不知道的预先存在的解决方案?

非常感谢您的帮助,每个连接

+0

为什么你在交易中运行不相关的查询?有什么理由这样做? –

+0

从技术上讲,不是无关的查询。例如,如果这是一个非严重错误,我想将错误保存到数据库,但在开始查询之前继续或从另一个表中检索权限。 –

+0

“我想将错误保存到数据库” - ouch !文本记录错误,而不是数据库。在运行事务之前必须检索权限。这就是全部 –

回答

2
  1. 交易。但是有些查询可能会受到来自不同连接的其他查询的影响。
  2. InnoDB连接交易中的所有查询。但对于自动提交,它会在每个提交后提交。这就是为什么你总是在交易。
  3. 你可以用你自己的变量来做到这一点......你也可以使用autocommit variable来发现你已经开始了一个交易。您可以通过查询select @@autocommit来完成。
+0

@Dogoferis,谢谢。 – sectus

2
  1. 自动提交是数据库连接的属性。如果您为每个用户打开一个新连接,则一个用户不会受到另一个用户的影响。
  2. 一旦你打开一个事务,你做的所有事情直到提交或回滚都是事务的一部分。您可以通过打开到数据库的新连接来防止这种情况发生,也可以重构代码以使事务不包含额外的操作。事实上,交易应尽可能小。