菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
0
0

Laravel 事务中 使用 悲观锁 小结

原创
05/13 14:22
阅读数 409

laravel 提供了方便快捷的数据库事务使用方式,在使用中遇到过几个容易混淆和被误导的地方,这里做个记录,希望哪里写的不对的地方各位大神指点一下
laravel 事务分为手动方式和自动方式,但如果我们在使用 laravel 提供的 sharedLock 或者 lockForUpdate 锁表的方式,为了避免不必要的麻烦和错误,建议最好使用手动提交事务来处理,如下图:

下面来说说 sharedLock(共享锁) 和lockForUpdate(悲观锁) 这两个在使用上的区别和影响

  1. sharedLock(共享锁)
    sharedLock 使用时等同于SQL语句 select * from transaction_test where type = 1 lock in share mode;
    在事务中使用 sharedLock 时才会生效,会把数据所在行进行锁定,此时被锁定的数据,不允许被其他操作修改,但是被锁定的数据,对查询操作没有影响,无论是普通查询还是事务中的查询操作,都不会受到影响.被锁定的数据,知道事务被提交或者回滚之后,才会释放.

  2. lockForUpdate(悲观锁)
    lockForUpdate 使用时等同于SQL语句 select * from transaction_test where type = 1 for update;
    lockForUpdate只有在事务中才会生效,使用lockForUpdate时数据所在行被锁定,此刻其他事务中的锁表操作会等待当前事务提交才会执行,但是对于非锁表和普通的查询操作并没有限制,有影响的只是你在事务中同样执行的锁表操作.

    总之,无论是共享锁还是悲观锁,受影响的只是事务中执行锁表的操作,对于普通的查询操作,和事务中的非锁表操作没有影响,
    同时需要注意的是,无论悲观锁还是共享锁当sql语句涉及到索引,并用索引作为查询或判断的依据时,那么mysql会用行级锁锁定所要修改的行,否则会使用表锁锁住整张表,因此在使用时一定要注意使用索引,否则会导致高的并发问题;

发表评论

0/200
0 点赞
0 评论
收藏
为你推荐 换一批