事務可以進行模擬SQL操作,當所有的SQL都操作成功的時候才進行SQL操作,只要有一個操作失敗就回滾當前事務的所有SQL操作,避免出現上面描述中出現的數據寫入不完整等情況
近來稍有時間研究了下MYSQL中的事務操作,在很多場合下很是適用,譬如在注冊的時候需要初始化很多張關聯表的時候,問答回復的時候需要至少同時操作兩張表,這些都會在某些時候只能成功更新一張表,而另外的SQL語句出現錯誤,正常的操作會導致初始化了一張表 ,其他的都木有能初始化,這個時候就會導致用戶表裡的用戶信息已經執行插入,導致提示注冊失敗,但是用戶已經注冊了部分信息,這個時候需要程序員去數據庫刪除相應的數據是一個比較不好的事情。 因此這邊考慮使用事務,事務可以進行模擬SQL操作,當所有的SQL都操作成功的時候才進行SQL操作,只要有一個操作失敗就回滾當前事務的所有SQL操作,避免出現上面描述中出現的數據寫入不完整等情況。 下面是鄙人寫的一小段代碼,歡迎大家參考和提出意見: 代碼如下: /** * @todo 多條sql的事務處理 * @param $sqls array * @return boole true/false */ public function doArraySqlActionsTran($password,$sqls){ $db = $this -> doSqlLink($password);//打開數據庫鏈接 $db -> autocommit(FALSE);//設置為不自動提交,因為MYSQL默認立即執行 //獲取SQL執行結果數組 for ($i=0;$i<count($sqls);$i++){ $result[$i] = $db -> query($sqls[$i]); } //解析SQL執行結果數組 for ($j=0;$j<count($result);$j++){ if ($result[$j]==FALSE){ $result[$j]='false'; }else{ $result[$j]='true'; } } //查找SQL結果數組中是否存在false結果集 if (in_array('false',$result)){ $sqlResult=FALSE; }else{ $sqlResult==TRUE; } //根據結果集進行數據庫回滾或者執行操作 if ($sqlResult==FALSE){ $db -> rollback();//判斷當執行失敗時回滾 $return=FALSE;// 正式環境中使用 //$return='ROOLBACK';//test 標記使用 }else{ $db -> commit();//執行事務s $return=TRUE;// 正式環境中使用 //$return='COMMIT';//test 標記使用 } $db->autocommit(true); //設置為非自動提交——事務處理 $db->close();//關閉連接 return $return; } 到此事務執行批量SQL操作基本完成,謝謝大家!