亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

先提交事務還是先觸發事件?

先提交事務還是先觸發事件?

翻閱古今 2019-09-05 18:50:21
/***創建一個用戶和用戶的關聯數據*@paramarray$userData*@paramarray$userFinanceData*@returnUserModel*@throws\Exception*/publicfunctionregister($userData,$userFinanceData){$db=UserModel::query()->getConnection();try{$db->beginTransaction();$user=UserModel::create($userData);$userFinanceData['user_id']=$user->id;FinanceAccountModel::create($userFinanceData);//事件觸發放在這里1?$db->commit();}catch(\Exception$exception){$db->rollBack();throw$exception;}//事件觸發放在這里2?event(newUserCreatedEvent($user));return$user;}如果放在[1]處,那么如果數據庫事務提交失敗,事件卻發出去了。導致事件消費者取不到該用戶的數據。如果放在[2]處,那么如果事件觸發失?。ɡ鐁edis連接錯誤),用戶卻創建成功了,但是創建用戶后需要做的一些事情沒有做,導致用戶數據不完整。怎么做才好?
查看完整描述

2 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

$flag=0;
try{
....
$db->commit();
$flag=1;
}catch(\Exception$exception){
$flag=0;
$db->rollBack();
throw$exception;
}
if($flag){
//事件觸發放在這里2?
}
.....
加個標記變量,可行不
                            
查看完整回答
反對 回復 2019-09-05
?
慕的地6264312

TA貢獻1817條經驗 獲得超6個贊

這種問題,你沒法避免的,分布式事務的問題。有一種可以參考下你在數據庫表里面建立一個事件表,就是要發的事件,隨事務一起提交。提交完后,你再去發了,發完記得在數據庫的記錄上做一個標記了,一個狀態是新建未發送,一個是已發送。另外,還得有一個線程池去掃那個表,去發那些發失敗的。接受事件的地方,還得做冪等。如果要更可靠的話,事件表的標記在加一個已處理,反正要就是比較麻煩了,要考慮的很多
                            
查看完整回答
反對 回復 2019-09-05
  • 2 回答
  • 0 關注
  • 364 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號