我以為可以減少下訂單出錯(cuò)的辦法
首先,數(shù)據(jù)庫(kù)類型要是InnoDB燥翅,其次,加鎖必須跟事務(wù)同時(shí)使用蜕提,還有森书,查詢的時(shí)候都必須帶鎖,比如: $user_mod->lock(true)->where('id=1')->select();這個(gè)地方用鎖查詢谎势,其次地方如果查詢這個(gè)user對(duì)象需要防止同時(shí)操作的話也要進(jìn)行加鎖凛膏,就是也要用lock(true)這種方式查詢:
代碼示例如下:
M()->startTrans();//開(kāi)啟事務(wù)
$map['userid']='test';//查詢條件
$user = M('User')->lock(true)->where($map)->find();//加鎖查詢
if($user)
{
//執(zhí)行你想進(jìn)行的操作, 最后返回操作結(jié)果 result
$result = true;
if(!$result)
{
M()->rollback();//回滾
$this->error('錯(cuò)誤提示');
}
}
M()->commit();//事務(wù)提交
$this->success('成功提示');
加上lock(true)的實(shí)際就是在查詢語(yǔ)句最后加上 for update,可以用如下這種方法測(cè)試脏榆,開(kāi)兩個(gè)窗口猖毫,一個(gè)窗口開(kāi)啟事務(wù),然后查詢加鎖一條數(shù)據(jù)须喂,另一個(gè)窗口再次查詢加鎖這條數(shù)據(jù)吁断,你會(huì)發(fā)現(xiàn)另一個(gè)窗口的查詢會(huì)一直等待,直到第一個(gè)窗口的事務(wù)提交坞生。如圖: