MySQL锁

MySQL作为关系型数据库需要实现ACID特性,即原子性、一致性、隔离性和持久性,由于MySQL作为数据库会同时处理多个连接,为了保证这些连接之间的操作能维持数据关系的完整性,需要借助锁实现数据并发访问的一致性,高并发访问的情况下会出现锁冲突的情况,锁粒度的大小会影响大数据库的并发访问性能。

 

乐观锁和悲观锁

乐观锁是在应用层面做并发控制,是一种在资源并发访问冲突比较少的情况下一种加锁方式,一般实现方式是通过在数据表中加版本号字段实现,每次对记录做更新操作之前获取该记录的版本号,然后针对版本号进行更新操作,如果出现版本不一致可以认为数据已经被修改了,应用程序可以做其它操作。

update t_key_value set `key` = 'abc', version = version+1 where version = 1

悲观锁是在数据库层面做并发访问控制,有数据库内部实现,MySQL数据库的悲观锁实现方式主要有共享锁(读锁)和排他锁(写锁)。

共享锁实现方式是在SQL后面加Lock in share mode,比如select * from user lock in share mode,即在符合条件的记录上添加上共享锁,如果有指定记录如id=1则只会在指定范围内加锁,否则会在整个表上加锁,加锁之后其它session可以继续访问,但是无法修改加了共享锁的记录

排他锁,实现方式是在SQL语句后面加for update,比如 select * from user where ID=1 for update,即在符合条件的rows上加排他锁,其它session就无法在这些记录上添加任何共享锁或者排他锁

MySQL的IInnoDB引擎默认修改数据结构的语句 update insert delete都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值