MySQL:PDO事务无法正常工作
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL:PDO事务无法正常工作相关的知识,希望对你有一定的参考价值。
所以我在PDO中使用事务时遇到问题。我正在做一个快速测试:
<?php
include_once "./init.php";
$sql = "insert into tbTest(cValue) values('1');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$sql = "SET autocommit=0;";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->beginTransaction();
$sql = "SET autocommit=0; insert into tbTest(cValue) values('2');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->rollBack();
$db->beginTransaction();
$sql = "SET autocommit=0; insert into tbTest(cValue) values('3');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->rollBack();
?>
我的第一次插入没有痒。
第二个插入(在第一个事务中)确实得到回滚。但是,我立即启动另一个事务,再次插入,然后再次回滚。通常,我希望在我的表中只收到“1”。
发生了什么是2回滚,但在第三次插入后,我再次回滚,我收到以下错误消息:
致命错误:/home /.../.../.../ testSQL.php:24中未捕获的异常'PDOException',消息'没有活动的事务'堆栈跟踪:#0 /home/.../ ... / ... / testSQL.php(24):PDO-> rollBack()#1 {main}在第24行/home/.../.../.../testSQL.php中引发
现在请忽略#行,我没有包含html的东西。第24行是第二个rollBack()。插入值“3”后的那个。
我完全不明白发生了什么。为什么第一笔交易有效而不是第二笔?我的表格不包含“3”。我不知道回滚是否仍然有效,尽管错误信息或autocomit = 0阻止值“3”使其进入表...我不知道。
有人有解释吗?
谢谢,
正如Nigel Ren所指出的那样,问题在于集合自动提交。 MyISAM表无法管理事务。当我的表是MyISAM时,我已经添加了set autocommit作为我的测试的一部分,当我切换到InnoDB时忘了删除它。
有效的版本:
<?php
//not in a transaction
$sql = "insert into tbTest(cValue) values('1');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->beginTransaction();
$sql = "insert into tbTest(cValue) values('2');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->rollBack();
$db->beginTransaction();
$sql = "insert into tbTest(cValue) values('3');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->commit();
//not in a transaction
$sql = "insert into tbTest(cValue) values('4');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->beginTransaction();
$sql = "insert into tbTest(cValue) values('5');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
$db->rollBack();
//not in a transaction
$sql = "insert into tbTest(cValue) values('6');";
$sttmt = $db->prepare($sql);
$sttmt->execute();
?>
只有值1,3,4和6才能进入表格。这是预期的结果!
再次感谢Nigel Ren!
以上是关于MySQL:PDO事务无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章
PHP PDO MySQL 以及它如何真正处理 MySQL 事务?