事務: 執行完A事件然后執行B事件,AB事件都執行完才算完成。可是有時候由於某些因素,A事件執行完,還沒來得及執行B事件。怎么辦?就需要回到A事件執行前。這種事情多見於電商支付功能。
mysql事務要求數據庫引擎必須是innoDB
自動控制事務處理:
public function delete(){
//由於第二條語句寫的有問題,只執行第一條
Db::table('user')->delete(1038);
Db::table('user')->deletesssssss(1039);
//由於第二條寫的有問題,兩條刪除都不執行
Db::transaction(function(){
Db::table('user')->delete(1040);
Db::table('user')->deletesssssss(1041);
});
}
1
2
3
4
5
6
7
8
9
10
11
手動控制事務
public function delete(){
// 啟動事務
Db::startTrans();
try{
$res=Db::table('user')->delete(1039);
if(!$res){
throw new \Exception('刪除失敗');
}else{
throw new \Exception('刪除成功');
}
// 提交事務
Db::commit();
} catch (\Exception $e) {
dump($e->getMessage());
// 回滾事務
Db::rollback();
//注意:我們做了回滾處理,所以id為1039的數據還在
}
}