PDO事务处理不能保持一致性

Posted cipherlab

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PDO事务处理不能保持一致性相关的知识,希望对你有一定的参考价值。

直接上代码:

 1 <?php
 2 require_once ‘db_const.php‘;
 3 require_once ‘helperPub.php‘;
 4 
 5 //测试存储过程的事务
 6 //http://localhost/API_WMS/WMS_BatchTest.php
 7 
 8 echo ‘Hello‘ . PHP_EOL;
 9 $ret = BatchTest();
10 
11 echo json_encode($ret, JSON_UNESCAPED_UNICODE);
12 
13 function BatchTest()
14 {
15     $ret_value = array();
16     echo ‘1‘ . PHP_EOL;
17     
18     $db = new PDO(STR_CONN, DB_USER, DB_PASS);
19     $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
20     $db->beginTransaction();    
21     try {
22 
23         $sql = ‘execute procedure PROC_S1;‘;
24         $statement = $db->prepare($sql);        
25         $ret = $statement->execute();
26         if(! $ret)
27         {
28             throw new Exception("PROC_S1");            
29         }  
30         echo ‘2‘ . PHP_EOL;
31         $sql = ‘execute procedure PROC_S2‘;
32         $statement = $db->prepare($sql);        
33         $ret = $statement->execute();
34         if(! $ret)
35         {
36             throw new Exception("PROC_S2");            
37         }    
38         $db->commit();            
39         unset($statement);
40         unset($db); 
41         $ret_value[‘CODE‘] = 0;
42         $ret_value[‘MSG‘] = ‘OK‘;
43         $ret_value[‘DATA‘] = ‘123‘;
44         return $ret_value;
45     }
46     catch (Exception $e)
47     {
48         echo ‘3‘ . PHP_EOL;
49         $db->rollBack();
50         echo ‘4‘ . PHP_EOL;
51         $ret_value[‘CODE‘] = 1;
52         $msg = change_error_msg( $e->getMessage());
53         $ret_value[‘MSG‘] = $msg;
54         $ret_value[‘DATA‘] = "";
55         return $ret_value;
56     }
57 }
58 
59 ?>

当存储过程PROC_S2中抛出异常时,PDO虽然执行了回滚,但PROC_S1操作的内容并没有发生回滚。数据库用的是FireBird。可能是FirdBird的PDO实现有BUG。

以上是关于PDO事务处理不能保持一致性的主要内容,如果未能解决你的问题,请参考以下文章

PHP操作PDO预处理以及事务

PHP使用PDO进行事务处理

PDO中的事务处理

PHP PDO 事务与自动提交

PDO如何完成事务操作

了解 pdo mysql 事务