PHP中執(zhí)行MYSQL事務(wù)解決數(shù)據(jù)寫入不完整等情況
更新時(shí)間:2014年01月07日 17:00:32 作者:
事務(wù)可以進(jìn)行模擬SQL操作,當(dāng)所有的SQL都操作成功的時(shí)候才進(jìn)行SQL操作,只要有一個(gè)操作失敗就回滾當(dāng)前事務(wù)的所有SQL操作,避免出現(xiàn)上面描述中出現(xiàn)的數(shù)據(jù)寫入不完整等情況
近來稍有時(shí)間研究了下MYSQL中的事務(wù)操作,在很多場合下很是適用,譬如在注冊的時(shí)候需要初始化很多張關(guān)聯(lián)表的時(shí)候,問答回復(fù)的時(shí)候需要至少同時(shí)操作兩張表,這些都會在某些時(shí)候只能成功更新一張表,而另外的SQL語句出現(xiàn)錯誤,正常的操作會導(dǎo)致初始化了一張表 ,其他的都木有能初始化,這個(gè)時(shí)候就會導(dǎo)致用戶表里的用戶信息已經(jīng)執(zhí)行插入,導(dǎo)致提示注冊失敗,但是用戶已經(jīng)注冊了部分信息,這個(gè)時(shí)候需要程序員去數(shù)據(jù)庫刪除相應(yīng)的數(shù)據(jù)是一個(gè)比較不好的事情。
因此這邊考慮使用事務(wù),事務(wù)可以進(jìn)行模擬SQL操作,當(dāng)所有的SQL都操作成功的時(shí)候才進(jìn)行SQL操作,只要有一個(gè)操作失敗就回滾當(dāng)前事務(wù)的所有SQL操作,避免出現(xiàn)上面描述中出現(xiàn)的數(shù)據(jù)寫入不完整等情況。
下面是鄙人寫的一小段代碼,歡迎大家參考和提出意見:
/**
* @todo 多條sql的事務(wù)處理
* @param $sqls array
* @return boole true/false
*/
public function doArraySqlActionsTran($password,$sqls){
$db = $this -> doSqlLink($password);//打開數(shù)據(jù)庫鏈接
$db -> autocommit(FALSE);//設(shè)置為不自動提交,因?yàn)镸YSQL默認(rèn)立即執(zhí)行
//獲取SQL執(zhí)行結(jié)果數(shù)組
for ($i=0;$i<count($sqls);$i++){
$result[$i] = $db -> query($sqls[$i]);
}
//解析SQL執(zhí)行結(jié)果數(shù)組
for ($j=0;$j<count($result);$j++){
if ($result[$j]==FALSE){
$result[$j]='false';
}else{
$result[$j]='true';
}
}
//查找SQL結(jié)果數(shù)組中是否存在false結(jié)果集
if (in_array('false',$result)){
$sqlResult=FALSE;
}else{
$sqlResult==TRUE;
}
//根據(jù)結(jié)果集進(jìn)行數(shù)據(jù)庫回滾或者執(zhí)行操作
if ($sqlResult==FALSE){
$db -> rollback();//判斷當(dāng)執(zhí)行失敗時(shí)回滾
$return=FALSE;// 正式環(huán)境中使用
//$return='ROOLBACK';//test 標(biāo)記使用
}else{
$db -> commit();//執(zhí)行事務(wù)s
$return=TRUE;// 正式環(huán)境中使用
//$return='COMMIT';//test 標(biāo)記使用
}
$db->autocommit(true); //設(shè)置為非自動提交——事務(wù)處理
$db->close();//關(guān)閉連接
return $return;
}
到此事務(wù)執(zhí)行批量SQL操作基本完成,謝謝大家!
因此這邊考慮使用事務(wù),事務(wù)可以進(jìn)行模擬SQL操作,當(dāng)所有的SQL都操作成功的時(shí)候才進(jìn)行SQL操作,只要有一個(gè)操作失敗就回滾當(dāng)前事務(wù)的所有SQL操作,避免出現(xiàn)上面描述中出現(xiàn)的數(shù)據(jù)寫入不完整等情況。
下面是鄙人寫的一小段代碼,歡迎大家參考和提出意見:
復(fù)制代碼 代碼如下:
/**
* @todo 多條sql的事務(wù)處理
* @param $sqls array
* @return boole true/false
*/
public function doArraySqlActionsTran($password,$sqls){
$db = $this -> doSqlLink($password);//打開數(shù)據(jù)庫鏈接
$db -> autocommit(FALSE);//設(shè)置為不自動提交,因?yàn)镸YSQL默認(rèn)立即執(zhí)行
//獲取SQL執(zhí)行結(jié)果數(shù)組
for ($i=0;$i<count($sqls);$i++){
$result[$i] = $db -> query($sqls[$i]);
}
//解析SQL執(zhí)行結(jié)果數(shù)組
for ($j=0;$j<count($result);$j++){
if ($result[$j]==FALSE){
$result[$j]='false';
}else{
$result[$j]='true';
}
}
//查找SQL結(jié)果數(shù)組中是否存在false結(jié)果集
if (in_array('false',$result)){
$sqlResult=FALSE;
}else{
$sqlResult==TRUE;
}
//根據(jù)結(jié)果集進(jìn)行數(shù)據(jù)庫回滾或者執(zhí)行操作
if ($sqlResult==FALSE){
$db -> rollback();//判斷當(dāng)執(zhí)行失敗時(shí)回滾
$return=FALSE;// 正式環(huán)境中使用
//$return='ROOLBACK';//test 標(biāo)記使用
}else{
$db -> commit();//執(zhí)行事務(wù)s
$return=TRUE;// 正式環(huán)境中使用
//$return='COMMIT';//test 標(biāo)記使用
}
$db->autocommit(true); //設(shè)置為非自動提交——事務(wù)處理
$db->close();//關(guān)閉連接
return $return;
}
到此事務(wù)執(zhí)行批量SQL操作基本完成,謝謝大家!
您可能感興趣的文章:
- 詳解MySQL:數(shù)據(jù)完整性
- 基于MySQL數(shù)據(jù)庫的數(shù)據(jù)約束實(shí)例及五種完整性約束介紹
- 深入淺析MySQL從刪庫到跑路_高級(一)——數(shù)據(jù)完整性
- MySQL使用mysqldump+binlog完整恢復(fù)被刪除的數(shù)據(jù)庫原理解析
- Django配置MySQL數(shù)據(jù)庫的完整步驟
- php使用mysqli和pdo擴(kuò)展,測試對比mysql數(shù)據(jù)庫的執(zhí)行效率完整示例
- php使用mysqli和pdo擴(kuò)展,測試對比連接mysql數(shù)據(jù)庫的效率完整示例
- Spring MVC實(shí)現(xiàn)mysql數(shù)據(jù)庫增刪改查完整實(shí)例
- MySQL數(shù)據(jù)庫卸載的完整步驟
- C#連接mysql數(shù)據(jù)庫完整實(shí)例
- MySQL是如何保證數(shù)據(jù)的完整性
相關(guān)文章
帖幾個(gè)PHP的無限分類實(shí)現(xiàn)想法~
帖幾個(gè)PHP的無限分類實(shí)現(xiàn)想法~...2007-01-01
PDO版本問題 Invalid parameter number: no parameters were bound
發(fā)現(xiàn)在客戶的某個(gè)PHP版本下,執(zhí)行某類操作的時(shí)候,總是會報(bào)如下錯誤 Invalid parameter number: no parameters were bound,經(jīng)google,發(fā)現(xiàn)是php版本過低導(dǎo)致2013-01-01
編寫php應(yīng)用程序?qū)崿F(xiàn)摘要式身份驗(yàn)證的方法詳解
本篇文章是對編寫php應(yīng)用程序?qū)崿F(xiàn)摘要式身份驗(yàn)證的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
深入PHP empty(),isset(),is_null()的實(shí)例測試詳解
本篇文章是對PHP empty(),isset(),is_null()的實(shí)例測試進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php實(shí)現(xiàn)指定字符串中查找子字符串的方法
這篇文章主要介紹了php實(shí)現(xiàn)指定字符串中查找子字符串的方法,涉及php中strpos()函數(shù)查找字符串的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
如何修改和添加Apache的默認(rèn)站點(diǎn)目錄
本篇文章是對修改和添加Apache的默認(rèn)站點(diǎn)目錄方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07
php中定時(shí)計(jì)劃任務(wù)的實(shí)現(xiàn)原理
php中定時(shí)計(jì)劃任務(wù)的實(shí)現(xiàn)原理,需要的朋友可以參考下2013-01-01

