laravel中使用事務:
Illuminate\Support\Facades\DB;
$order_id = 12;
DB::transaction(function () use ($order_id) {
$tmp = $order_id;
});
列子:
// 獲取組織ID
$organizationId = Request()->header('ORGANIZATION-ID');
DB::transaction(function() use($request,$organizationId,$teacherGroup){
//插入作業基本信息
$homeworkId = $this->insertBaseHomework($request,$organizationId);
//插入作業師培組信息
$this->insertHomeworkTeacherGroup($homeworkId,$teacherGroup);
});
sharedLock (共享鎖)
sharedLock 使用時等同於 SQL 語句 select * from transaction_test where type = 1 lock in share mode;
在事務中使用 sharedLock 時才會生效,會把數據所在行進行鎖定,此時被鎖定的數據,不允許被其他操作修改,但是被鎖定的數據,對查詢操作沒有影響,無論是普通查詢還是事務中的查詢操作,都不會受到影響。被鎖定的數據,直到事務被提交或者回滾之后,才會釋放.
lockForUpdate (悲觀鎖)
lockForUpdate 使用時等同於 SQL 語句 select * from transaction_test where type = 1 for update;
lockForUpdate 只有在事務中才會生效,使用 lockForUpdate 時數據所在行被鎖定,此刻其他事務中的鎖表操作會等待當前事務提交才會執行,但是對於非鎖表和普通的查詢操作並沒有限制,有影響的只是你在事務中同樣執行的鎖表操作.
總之,無論是共享鎖還是悲觀鎖,受影響的只是事務中執行鎖表的操作,對於普通的查詢操作,和事務中的非鎖表操作沒有影響,
同時需要注意的是,無論悲觀鎖還是共享鎖當 sql 語句涉及到索引 , 並用索引作為查詢或判斷的依據時,那么 mysql 會用行級鎖鎖定所要修改的行,否則會使用表鎖鎖住整張表,因此在使用時一定要注意使用索引,否則會導致高的並發問題;