laravel mysql 悲观锁_laravel中使用事务和锁表

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);

});

3351e5d95aaf38434114d51e9f7972a8.png

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 会用行级锁锁定所要修改的行,否则会使用表锁锁住整张表,因此在使用时一定要注意使用索引,否则会导致高的并发问题;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值