1. 要程序裡面支持事務,首先連接的數據庫和數據表必須支持事務 mysql 為例:
數據庫InnoDB支持 transactions
數據表支持事務:InnoDB 支持transaction
2. 框架thinkphp 支持事務代碼
public function testrollback(){ $model1 = D('item'); $model2 = D('vote'); $model1->startTrans(); $res1 = $model1->where('id = 5')->delete(); $res2 = $model2->where('id = 2')->delete(); dump($res1); dump($res2); if($res1 && $res2){ $model1->commit(); //只有$res1 和 $res2 都執行成功是才真正執行上面的數據庫操作 dump("commit"); }else{ $model1->rollback(); // 條件不滿足,回滾 dump("rollback"); } dump("over"); exit; }
3. 原始PHP 代碼事務實例
方法一:只支持數據庫和數據表都是 innoDB 的情況
public function rollbackoriginal1(){ $conn = mysql_connect('127.0.0.1','summerzi','summerzi') or die('DB connection failed!'); mysql_select_db('summer',$conn); mysql_query('set names "GBK"'); mysql_query('BEGIN'); $sql1 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(41,1,233);"; $sql2 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(fdfd,2,235);"; $res1 = mysql_query($sql1); $res2 = mysql_query($sql2); dump($sql1); dump($sql2); dump($res1); dump($res2); if($res1 && $res2){ mysql_query('COMMIT'); dump('commit success!'); }else{ mysql_query('ROLLBACK'); dump('commit failed, rollback!'); } mysql_query('END'); }
方法二:(注意:對於不支持事務的MyISAM引擎數據庫可以使用表鎖定的方法)
public function rollbackoriginal2(){ $conn = mysql_connect('127.0.0.1','summerzi','summerzi') or die('DB connection failed!'); mysql_select_db('summer',$conn); mysql_query('set names "GBK"'); mysql_query('SET AUTOCOMMIT=0');////設置mysql不自動提交,需自行用commit語句提交 $sql1 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(41,1,233);"; $sql2 = "INSERT INTO `summer_userdata`(`uid`,`type`,`target_id`) VALUES(44,2,235);"; //mysql_query("LOCK TABLES `hmbl_userdata` WRITE");//鎖定表 $res1 = mysql_query($sql1); $res2 = mysql_query($sql2); dump($sql1); dump($sql2); dump($res1); dump($res2); //mysql_query("UNLOCK TABLES");//解除鎖定 if($res1 && $res2){ mysql_query('COMMIT'); dump('commit success!'); }else{ mysql_query('ROLLBACK'); dump('commit failed, rollback!'); } mysql_query("SET AUTOCOMMIT=1"); mysql_query('END'); }
php + mysql 對事務的處理比較簡單,涉及到業務中多個數據操作,就可以考慮用事務處理