数据库的各种锁

1.乐观锁和悲观锁(悲观锁又包括共享锁和排它锁)

乐观锁不是数据库自带的需要去手动实现,思想是乐观,不认为这次操作会导致冲突,在操作后再判断是否发生了冲突,通常操作是给数据表加一个版本的字段version,每次操作给版本加1,简单说就是先查版本号version的值,然后执行更新操作的时候判断version和之前的版本号是否一致:代码实现:

查询出商品信息    select (status,status,version) from t_goods where id=#{id}

修改商品status为2    update t_goods set status=2,version=version+1 where id=#{id} and version=#{version};

 

2.悲观锁与乐观锁相反,悲观锁是数据库自己实现内,思想是认为此次操作会发生冲突,所以每次操作都通过悲观锁才能进行数据操作,类似java的synchronized,效率比乐观锁低,使用时直接调用相关语句就可以了。

a.(悲观锁中的共享锁:共享锁也叫读锁,简称S锁,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能改;select ... lock in share mode(加共享锁)

b.(悲观锁中的排它锁:排它锁也叫写锁,简称X锁,排他锁与其他锁不能共存,一个事务获取了一个数据行的排他锁,其他事务就不能获取改行的其他锁,包括共享锁和排它锁,获取排它锁的事务可以对数据行读写和修改;select ...for update(加排他锁)

 

3.间隙锁:当我们使用范围条件而不是相等条件检索数据,并请求排他锁时,innoDB会给符合条件的已有数据记录的索引项加锁,对于兼职在条件范围内并不存在的记录叫间隙,innoDB会对这个间隙加锁,这种锁机制就是所谓的间隙锁;

4.表锁:MyISAM引擎在查询(select)前会自动给设计的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁;MYSQL的表级锁有两种模式:表共享读锁,表独占写锁;读锁会阻塞写,写锁会阻塞读和写

5.行锁:查询某一行时,如果是通过主键或者索引选中的,这个时候是行锁,如果是其他条件选中的,这个时候行级锁会升级为表锁,其他事务将无法对当前表进行更新和插入操作;

mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。 

所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

baker_zhuang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值