mysql锁个人总结、理解

        首先第一点,加锁是在开始事务到提交事务这个之间,不懂事务先提前取了解一下。

        锁的分类(个人理解)

        按照类型/作用分,可以分为共享锁(读锁)排他锁(写锁)

        按照锁的粒度/范围来分,可分为  全局锁、表级锁、行级锁

        按照模式分,可分为  乐观锁悲观锁

        按照算法分为,可分为 间隙锁、临键锁、记录锁

        

        mysql引擎

        mysql引擎默认为InnoDB ,支持行锁和表锁,并且支持事务,而MyISAM不支持事务,所以为了保证数据的一致性,每次操作时,都是上的表锁。从而确保数据一致性。

        

        事务隔离级与锁之间的关系

        首先先理解mysql中两种不同的select方式:

        快照读:读取的是记录的历史版本,在一个没有结束的事务中,快照读每次读取的都和在本次事务中第一次读到的信息一致(不加读锁)

        当前读:读取的是记录的最新版本(会加读锁)

        1.未提交读(RU)

        实现机制:

                事务读取数据的时候采用当前读

                事务修改数据的时候加共享锁,提交(是修改后提交,不是事务结束提交)后释放(解决了修改时,数据被删除或修改的情况)(因为加锁是修改完后马上释放了,自然其他事务就可以来读取当前事务未提交的数据,也就造成了脏读)

        2.提交读(RC)

        实现机制:

                事务在读数据的时候加读锁(当前读),读完即释放共享锁。

                事务在修改某数据时会加上写锁,直到事务结束再释放,这样的机制保证了RC隔离级别不会发送脏读,只有提交过的事务,才能被其他事务看见。 (因为,在 A事务两次查询中间可能会有B事务提交一个修改数据的操作,从而造成A事务前后读取的两次记录数据不一致,造成不可重复读的问题)

        3.可重复读(RR)

        实现机制:mvcc

        事务在读数据的时候采用快照读(解决不可重复读问题)

        事务在修改数据的时候加写锁,并且Mysql采用 间隙锁 ,但触发临键锁(特殊的间隙锁)的前提是(查询条件列不可以是唯一索引和主键),在触发临键锁(特殊的间隙锁)后,会锁住一定范围内的数据,防止在这个范围内插入数据,这个机制可以在一定程度上降低发送幻读的可能。(在临键锁外的区间还是可能会出现增、删、改,所以还是可能会出现幻读)

        4.串行化(Serializable)

        事务在读取数据时,对整个表加读锁,提交或回滚事务后释放。

        事务在修改数据时,对整个表加写锁,提交或回滚事务后释放。

        这是最高的隔离级别,可以解决脏读,不可重复读和幻读,但也是效率最差的一个。它解决这些事务并发带来的问题就说把这些操作变成串行操作,一旦不符合就阻塞。

        

        

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值