事務(wù)操作對(duì)很多新人來(lái)說(shuō),可能有點(diǎn)陌生,即使看了thinkphp6官方手冊(cè)中事務(wù)操作的部分,也仍然不知所解。下面就給大家介紹下事務(wù)操作。
一、先說(shuō)說(shuō)使用場(chǎng)景。
假設(shè)我需要給朋友轉(zhuǎn)賬1000元錢(qián),正常的業(yè)務(wù)邏輯是:
1、銀行從我的賬戶(hù)中扣除1000元??
2、銀行給朋友賬戶(hù)加上1000元。
立即學(xué)習(xí)“PHP免費(fèi)學(xué)習(xí)筆記(深入)”;
如果一切順利,則轉(zhuǎn)賬成功!
那么問(wèn)題來(lái)了,如果我不小心把銀行賬戶(hù)輸錯(cuò),導(dǎo)致銀行查找不到我輸入的銀行賬戶(hù),但是這個(gè)時(shí)候錢(qián)已經(jīng)從我的賬戶(hù)扣除了,如何處理呢?
我們生活中經(jīng)常說(shuō)“如果錢(qián)打不過(guò)去,銀行會(huì)退回來(lái)的”,就是這個(gè)意思。
2、事務(wù)操作定義。
那么通過(guò)上面的例子,我們理解下到底什么是事務(wù)操作,事務(wù)指的是邏輯上的一組操作,組成這組操作的各個(gè)單元要么全都成功,要么全都失敗。
就如上面的打錢(qián)例子,要么打錢(qián)成功,如果不成功,需要把我的錢(qián)退回來(lái),也就是返回到初始狀態(tài),也叫做“回滾”。
3、ThinkPHP6中的事務(wù)操作。
我們理解了事務(wù)操作的使用場(chǎng)景,那么在ThinkPHP6中如何使用呢?
Db::transaction(function?()?{ ????Db::table('think_user')->insert(['name'=>'aaa']); ????Db::table('think_user')->delete(1); });
我們看上面的例子,只有當(dāng)我們插入記錄成功的時(shí)候才會(huì)做刪除操作,如果插入不成功,不會(huì)做刪除操作。
比如我們故意寫(xiě)錯(cuò)一個(gè)字段name1,數(shù)據(jù)表中沒(méi)有name1該字段,插入程序不會(huì)執(zhí)行成功,那么下面的刪除語(yǔ)句沒(méi)有問(wèn)題,但是他依然不會(huì)執(zhí)行。
除此之外,我們還可以手動(dòng)控制事務(wù)。看下面代碼:
//?啟動(dòng)事務(wù) Db::startTrans(); try?{ ????Db::table('think_user')->find(1); ????Db::table('think_user')->delete(1); ????//?提交事務(wù) ????Db::commit(); }?catch?(Exception?$e)?{ ????//?回滾事務(wù) ????Db::rollback(); }