mysql乐观锁和悲观锁

乐观锁是从应用系统层面进行并发控制,常用的是版本号方式和时间戳方式。
当一个进程访问数据时会给表增加一个版本号字段,每进行一次更新就会加1,进程开始会获得一个版本号,当要update时再获取一次版本号,进行比较,若相同则更新,不同则不更新。时间戳方式原理和前面一样,比较的是线程之前取到的时间戳和更新时取到的时间戳
一般用来解决数据库并发下的写–写冲突
CAS思想
语句后面加 lock in share mode

悲观锁是从数据库层面做并发控制,这个应该是真正意义的加锁,分为共享锁和排他锁。虽然可以加共享锁,但是mysql的update、insert、delete自动加了排他锁 。使用悲观锁,需要关闭mysql的auto_commit模式
语句后面加 for update

1.MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
2.MySQL InnoDB默认行级锁。 行级锁都是基于索引的,如果一条SQL语句用不到索引是不会使用行级锁的,会使用表级锁把整张表锁住。

当前读和快照读的区别

当前读
像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁

快照读
像不加锁的select操作就是快照读,即不加锁的非阻塞读;快照读的前提是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于提高并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读可能读到的并不一定是数据的最新版本,而有可能是之前的历史版本

参考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值