PDO 事务是不是涵盖 PDO::query()?
Posted
技术标签:
【中文标题】PDO 事务是不是涵盖 PDO::query()?【英文标题】:Do PDO transactions cover PDO::query()?PDO 事务是否涵盖 PDO::query()? 【发布时间】:2012-07-08 03:22:39 【问题描述】:php.net 的 PDO 事务示例显示 PDO::exec()
已进行事务处理,但没有使用 PDO::query()
的此类示例。
交易是否覆盖PDO::query()
?
另外,据我了解,PDO::query()
返回一个结果集。如果事务处理,怎么会有结果集,因为语句在提交之前不应该执行? (这是否意味着 PDO::query()
确实没有被交易?)我似乎无法找到官方参考说明它是否是。
【问题讨论】:
其实,我觉得我对交易有误解。PDO::exec()
还返回一些东西:受影响的行数;这意味着它被执行。那么一定是在PDO::commit()
被调用之前执行了语句;但他们只是rollBack
-able。所以现在在我看来PDO::query()
应该被交易。
*The result of any work done after this point will remain invisible to other database-users until the system processes a COMMIT statement. *。当您调用这些语句时,它们确实会被执行,将它们保存在事务中是数据库引擎的责任。
@DCoder - 感谢您的参考!阅读ckruse的回答后,假设他/她是正确的,我想澄清一件事。 “已完成的工作 [...] 将对其他数据库用户保持不可见”,但实际上,从您自己的角度来看,将立即完成(在提交之前)并返回结果(无论是结果数组的形式、受影响的行数还是成功/失败指示符)。
【参考方案1】:
您误解了交易。事务只是保证操作是原子的:要么所有操作都成功,要么都不成功。一旦你开始一个事务,每个查询都将被执行,并将记录在事务日志中。如果操作失败并且您回滚,则每个操作都将被还原。
也就是说:查询是否可交易并不取决于您使用的是exec
还是query
,而是取决于查询类型。 INSERT
、UPDATE
和 DELETE
是可交易的,其他操作(例如 ALTER TABLE
)可能是可交易的,也可能是不可交易的,具体取决于您的 DBMS。
【讨论】:
明白了。因此,每个操作确实是“随叫随到”,但作为一个整体,在提交之前对其他人是可撤销且不可见的。谢谢! 这是 MVCC(多版本并发控制)方式,是的。您还可以锁定相关行直到事务提交,例如MSSQL Server 2000 可以做到这一点。以上是关于PDO 事务是不是涵盖 PDO::query()?的主要内容,如果未能解决你的问题,请参考以下文章