MySQL锁机制

  1. 共享锁(读锁):

共享锁(S 锁)允许并发事务在封闭式并发控制下读取 (SELECT)资源。资源上存在共享锁(S锁)时,任何其他事务都不能修改数据。读取操作一完成,就立即释放资源上的共享锁(S锁),除非将事务隔离级别设置为可重复读或更高级别,或者在事务持续时间内用锁定提示保留共享锁(S锁)。

 

  1. 共享锁在MySQL中的实现,

A,通过在执行语句后面加上lock in share mode就代表对某些资源加上锁呢,

先开启一个数据库执行窗口,设置为手动提交,在执行select * from test_mysql where id=1 lock in share mode;表示表示加入共享锁;

B,开启另一个窗口,执行select * from test_mysql where id=1;会查询到结果,

但是执行更新操作,会出现延迟,直到第一个事务提交成功后,更新才会执行成功;

 

 

  1. 排它锁(写锁):

排他锁(X 锁)可以防止并发事务对资源进行访问。排他锁不与其他任何锁兼容。使用排他锁(X锁)时,任何其他事务都无法修改数据;仅在使用 NOLOCK提示或未提交读隔离级别时才会进行读取操作。(执行insert,update,delete操作时,会自动加上排它锁)

  1. 更新锁(U):-- 更新锁可以防止常见的死锁。

更新锁在共享锁和排他锁的杂交。更新锁意味着在做一个更新时,一个共享锁在扫描完成符合条件的数据后可能会转化成排他锁。

  1. 行锁: SELECT * from test_mysql where id = "1"  lock in share mode;

由于对于city表中,id字段为主键,就也相当于索引。执行加锁时,会将id这个索引为1的记录加上锁,那么这个锁就是行锁

  1. 表锁:与行锁相对应,当执行语句的where条件中没有出现主键时,默认加表锁;

,乐观锁和悲观锁;

  1. 悲观锁:每次获取数据的时候,都会担心数据被修改,所以在获取数据的时候会对数据加锁, 确保自己在使用过程中,数据不会被别人修改,使用完成后进行解锁;用于数据加锁,期间对该数据进行读写的其他线程需要等待;(共享锁和排它锁都属于悲观锁的范畴,悲观锁一般数据库都默认实现)
  2. 乐观锁:每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会对           数据加锁,但是在更新该数据的时候需要判断该数据是否被别人修改过,如果数据被别人修改过,则不进行数据更新,如果数据没有被别人修改过,则进行数据更新;期间,由于数据没有加锁,所以可以被其他线程进行读写操作;
  3. 使用场景:
  1. 悲观锁:比较适合写入操作比较频繁的场景,如果出现大量的读取操作,每次读取的时候会进行加锁,这样会增加大量的开销,降低了系统的吞吐量;
  2. 乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量

 

乐观锁的实现:在表中的数据进行操作时(更新),先给数据表加一个版本(version)字段,每操作一次,将那条记录的version字段加1,也就是先查询出那条记录,获取version字段,如果要对那条记录进行操作(更新)则判断此刻version的值是否与刚刚查询出来时的version的值相等,如果相等,则说明这段期间,没有其他程序对其进行操作,则可以执行更新,version的值加1,反之,不能进行更新操作;

                 

举例:下单操作3步骤:

  1. 查询出商品信息:

Select (status,categoey,version) fron t_goods where id=#{id};

  1. 更具商品信息生成订单
  2. 修改商品status2

update t_goods set status =2,version=version+1 where id=#{id} and version=#{version};

总结:读取频繁使用乐观锁,写入频繁使用悲观锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值