當(dāng)然可以了,事務(wù)是數(shù)據(jù)庫的事務(wù)和哪個(gè)模型沒有關(guān)系,需要注意的是事物開啟需要在一開始使用事物就全部開啟了,如果分開的話,你會(huì)發(fā)現(xiàn)第二個(gè)事物開啟會(huì)把第一個(gè)事物給提交了。
成都創(chuàng)新互聯(lián)是專業(yè)的蘭考網(wǎng)站建設(shè)公司,蘭考接單;提供做網(wǎng)站、網(wǎng)站設(shè)計(jì),網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行蘭考網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
$sql2 沒發(fā)現(xiàn)錯(cuò)誤 執(zhí)行成功。
這個(gè)可以分段驗(yàn)證
直接 print_r($r2) 看是否真的有SQL錯(cuò)誤
另外 !$r1 這種寫法是否可以判斷錯(cuò)誤?
你 $r2 如果輸出錯(cuò)誤 是否是 $r2 === false ? 也許是其他?
用 var_dump 查看下
tp開啟事務(wù): M()-startTrans(); M()-commit();M()-rollback();#thinkphp3.2
事務(wù)操作一般情況下只是在數(shù)據(jù)庫層面上體現(xiàn),在PHP中是沒有事務(wù)概念的。常用的數(shù)據(jù)庫MySQL,SQLServer,Oracle等都支持事務(wù)處理。:)
其實(shí)很簡單就是SQL語句,在執(zhí)行事務(wù)前使用Begin Trans(說明不同的數(shù)據(jù)庫事務(wù)處理不同,思路相同)
然后進(jìn)行事務(wù)處理,如果成功則Commit提交事務(wù),如果失敗可以使用Rollback回滾事務(wù)。
希望對(duì)你有幫助。
近來稍有時(shí)間研究了下MYSQL中的事務(wù)操作,在很多場合下很是適用,譬如在注冊(cè)的時(shí)候需要初始化很多張關(guān)聯(lián)表的時(shí)候,問答回復(fù)的時(shí)候需要至少同時(shí)操作兩張表,這些都會(huì)在某些時(shí)候只能成功更新一張表,而另外的SQL語句出現(xiàn)錯(cuò)誤,正常的操作會(huì)導(dǎo)致初始化了一張表
,其他的都木有能初始化,這個(gè)時(shí)候就會(huì)導(dǎo)致用戶表里的用戶信息已經(jīng)執(zhí)行插入,導(dǎo)致提示注冊(cè)失敗,但是用戶已經(jīng)注冊(cè)了部分信息,這個(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ù)寫入不完整等情況。
下面是鄙人寫的一小段代碼,歡迎大家參考和提出意見:
復(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è)置為不自動(dòng)提交,因?yàn)镸YSQL默認(rèn)立即執(zhí)行
//獲取SQL執(zhí)行結(jié)果數(shù)組
for
($i=0;$icount($sqls);$i++){
$result[$i]
=
$db
-
query($sqls[$i]);
}
//解析SQL執(zhí)行結(jié)果數(shù)組
for
($j=0;$jcount($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è)置為非自動(dòng)提交——事務(wù)處理
$db-close();//關(guān)閉連接
return
$return;
}
到此事務(wù)執(zhí)行批量SQL操作基本完成,謝謝大家!