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 无法正常工作?

PHP PDO MySQL 以及它如何真正处理 MySQL 事务?

了解 pdo mysql 事务

Spring Boot + Spring Data JPA + 事务无法正常工作

划分 foreach 无法正常工作

PDO如何完成事务操作