Php PDO MySQL事务

Php PDO MySQL事务,php,transactions,pdo,Php,Transactions,Pdo,我有3个关于PDO和交易的问题。 我对交易很陌生,所以请理解我的误解 首先,我会解释一下情况: 我以单例模式创建了一个PDO包装器,它使用innoDB表访问MySQL数据库。我创建包装器的原因是为了提供额外的功能和提高可移植性 每次对象需要访问数据库时,它都会检索相同的连接 我的问题如下: 1) 我知道如果我使用PDO::beginTransaction()开始事务,那么会将MySQLs自动提交模式设置为关闭。但是,这是否只影响当前用户到数据库的连接,或者每个访问者的连接,因为它是包含autoc

我有3个关于PDO和交易的问题。 我对交易很陌生,所以请理解我的误解

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

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

我的问题如下:

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

2) 我需要执行与实际事务无关的MySQL查询。这些查询在不相关的对象中执行,但是仍然使用与事务相同的MySQL连接。 我刚刚发现,与事务无关的查询仍然包含在事务中,这导致了不希望出现的效果。这有什么办法吗?还是我的PHP设计不适合这种事务使用

3) 我使用的是PHP5.1。它支持以下函数:
PDO::beginTransaction()
PDO::commit()
PDO::rollBack()

我知道,如果我调用
PDO::rollBack()
,当事务无效时,就会抛出一个PDO异常。解决这个问题的方法是在使用rollBack()之前,使用
PDO::inTransaction()
检查事务,但是直到5.3版本才将其添加到PHP中

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

非常感谢你的帮助

  • 每个连接的事务。但是有些查询可能会受到来自不同连接的其他查询的影响
  • 对于InnoDB连接,事务中的所有查询。但使用自动提交时,它会在每一次提交之后提交。这就是为什么你总是在交易中
  • 你可以用你自己的变量。。。您还可以使用来发现您已经开始了一项事务。您可以使用查询
    选择@@autocommit
    来执行此操作
  • 每个连接的事务。但是有些查询可能会受到来自不同连接的其他查询的影响
  • 对于InnoDB连接,事务中的所有查询。但使用自动提交时,它会在每一次提交之后提交。这就是为什么你总是在交易中
  • 你可以用你自己的变量。。。您还可以使用来发现您已经开始了一项事务。您可以使用查询
    选择@@autocommit
    来执行此操作
  • 自动提交是数据库连接的一个属性。如果为每个用户打开新连接,则一个用户不会受到另一个用户的影响
  • 打开事务后,在提交或回滚之前所做的一切都是事务的一部分。可以通过打开与数据库的新连接来防止这种情况,也可以重新构造代码,使事务不包含额外的操作。事实上,交易应该尽可能小
  • 自动提交是数据库连接的一个属性。如果为每个用户打开新连接,则一个用户不会受到另一个用户的影响
  • 打开事务后,在提交或回滚之前所做的一切都是事务的一部分。可以通过打开与数据库的新连接来防止这种情况,也可以重新构造代码,使事务不包含额外的操作。事实上,交易应该尽可能小

  • 为什么在事务中运行不相关的查询?有什么理由这样做吗?从技术上讲,不是无关的查询。例如,如果有一个非关键性错误,我想将错误保存到数据库中,但在开始查询之前继续,或从另一个表中检索权限
    我想将错误保存到数据库中
    -哎哟!错误的文本日志,而不是数据库。在运行事务之前必须检索权限。也就是说,所有致命错误都会保存到文本日志中,但可捕获的异常、成功消息和用户信息错误会保存到数据库中。出于好奇,为什么不将错误数据保存到数据库中呢?谢谢你的评论。为什么在事务中运行不相关的查询?有什么理由这样做吗?从技术上讲,不是无关的查询。例如,如果有一个非关键性错误,我想将错误保存到数据库中,但在开始查询之前继续,或从另一个表中检索权限
    我想将错误保存到数据库中
    -哎哟!错误的文本日志,而不是数据库。在运行事务之前必须检索权限。也就是说,所有致命错误都会保存到文本日志中,但可捕获的异常、成功消息和用户信息错误会保存到数据库中。出于好奇,为什么不将错误数据保存到数据库中呢?谢谢你的评论。