0

我有 3 个关于 PDO 和事务的查询。我对交易很陌生,所以请理解我的误解!

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

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

我的问题如下:

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

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

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

我知道,如果我调用PDO::rollBack(),当事务无效时,会抛出 PDOException 。解决方案是PDO::inTransaction()在使用 rollBack() 之前检查事务,但是直到 5.3 才添加到 PHP 中。

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

非常感谢您的帮助

4

2 回答 2

2
  1. 每个连接的事务。但是某些查询可能会受到来自不同连接的相互影响。
  2. 对于 InnoDB 连接,事务中的所有查询。但是使用自动提交,它会在每个之后提交。这就是为什么你总是在交易中。
  3. 你可以用你自己的变量来做到这一点......你也可以使用自动提交变量来找出你已经开始了一个事务。你可以用 query 来做select @@autocommit
于 2013-04-03T12:39:35.373 回答
2
  1. 自动提交是数据库连接的一个属性。如果您为每个用户打开一个新连接,则一个用户不会受到另一个用户所做的事情的影响。
  2. 一旦你打开了一个事务,你在提交或回滚之前所做的一切都是事务的一部分。您可以通过打开与数据库的新连接来防止这种情况发生,或者您可以重构代码以使事务不包含额外的操作。事实上,交易应该尽可能小。
于 2013-04-03T12:40:27.480 回答