重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
近來稍有時間研究了下MYSQL中的事務操作,在很多場合下很是適用,譬如在注冊的時候需要初始化很多張關聯表的時候,問答回復的時候需要至少同時操作兩張表,這些都會在某些時候只能成功更新一張表,而另外的SQL語句出現錯誤,正常的操作會導致初始化了一張表
集寧ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18982081108(備注:SSL證書合作)期待與您的合作!
,其他的都木有能初始化,這個時候就會導致用戶表里的用戶信息已經執行插入,導致提示注冊失敗,但是用戶已經注冊了部分信息,這個時候需要程序員去數據庫刪除相應的數據是一個比較不好的事情。
因此這邊考慮使用事務,事務可以進行模擬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;$icount($sqls);$i++){
$result[$i]
=
$db
-
query($sqls[$i]);
}
//解析SQL執行結果數組
for
($j=0;$jcount($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操作基本完成,謝謝大家!
事務操作一般情況下只是在數據庫層面上體現,在PHP中是沒有事務概念的。常用的數據庫MySQL,SQLServer,Oracle等都支持事務處理。:)
其實很簡單就是SQL語句,在執行事務前使用Begin Trans(說明不同的數據庫事務處理不同,思路相同)
然后進行事務處理,如果成功則Commit提交事務,如果失敗可以使用Rollback回滾事務。
希望對你有幫助。
tp開啟事務: M()-startTrans(); M()-commit();M()-rollback();#thinkphp3.2
事務處理具有四個特性:原子性、一致性、獨立性、持久性。
并不是所有的數據庫都支持事務處理的,PDO 為能夠執行事務處理的數據庫提供事務支持。
配置事務處理需注意:
1、關閉 PDO 的自動提交;
$pdo-setAttribute(PDO::ATTR_AUTOCOMMIT, false);
2、開啟一個事務需要的方法;
$pdo-beginTransaction(); // 開啟一個事務
$pdo-commit(); // 提交事務
$pdo-rollback(); // 回滾事務
3、一般事務處理是運行在 try...catch...語句中,當事務失敗時執行 catch 代碼段。
php
try {
$pdo-beginTransaction(); // 開啟一個事務
$row = null;
$row = $pdo-exec("xxx"); // 執行第一個 SQL
if (!$row)
throw new PDOException('提示信息或執行動作'); // 如出現異常提示信息或執行動作
$row = $pdo-exec("xxx"); // 執行第二個 SQL
if (!$row)
throw new PDOException('提示信息或執行動作');
$pdo-commit();
} catch (PDOException $e) {
$pdo-rollback(); // 執行失敗,事務回滾
exit($e-getMessage());
}
?
在事務中的 SQL 語句,如果出現錯誤,那么所有的 SQL 都不執行。當所有 SQL 有無誤的時候,才提交執行。