MYSQL-INNODB-lock

锁:
innodb支持行锁和表锁,如果操作的是索引列,则对索引加行锁,如果没用索引,则使用表锁

锁类型:
1.Innodb存在两种标准的行级锁:共享锁(S LOCK 允许事务读取一行数据);排他锁(X LOCK 允许事务删除或更新一行数据)
2.Innodb为了支持多粒度的锁机制,推出意向锁,意向锁是表级锁:意向共享锁(IS LOCK)、意向排他锁(IX LOCK)

一致性非锁定操作:
1.指Innodb通过多版本控制得方式来读取当前执行时间数据库中的行的数据,如果读取的行正在执行update/delete操作,这时读操作不会因此等待行上锁的释放,会去读取行的一个快照
2.一行可能有多个快照,我们称之为行多版本技术
3.在read commited和repeatable read(Innodb存储引擎默认事务隔离级别)不同的事务隔离级别下,使用非锁定的一致性读,但是对于快照的定义却不相同,在read commited事务隔离级别下,总是读取最新的一份快照;在repeatable read事务隔离级别下,总是读取事务开始时的行版本数据

事务性数据库的ACID特性:
ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性
(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性,否则在事务过程(Transaction processing)当中无法保证数
据的正确性,交易过程极可能达不到交易方的要求

在特殊情况下对读取也要进行加锁
对select支持两种加锁操作:
1.select..for update 加X锁,其他事务想加任何锁都会被阻塞
2.select..lock in share mode 会阻塞X锁,不会阻塞S锁
注:在执行select..for update时还是可以进行读取,这里加锁只是说可以对select加锁不影响非锁定一致性读

自增长和锁:
1.mysql5.1.22版本之前采用AUTO_INC_Locking。这种锁是一种特殊的表级锁,为了提升插入性能,锁不是在一个事务结束后才释放,而是
在执行完一个sql语句才释放。
2.mysql5.1.22版本开始innodb引擎提供一种轻量级互斥量的自增长方式,大大提升自增长插入的性能,mysql提供一个参数:
注:innodb_autoinc_lock_mode配置锁模式,默认为1

对插入进行分类:
insert-like:指所有的插入语句
simple-insert:指insert、replace,但不包含insert on duplicate key update,能确定插入条数
Bulk-inserts:指插入前不能确定条数,如:insert..select,replace..select,load..data
mixed-mode inserts:指有一部分是自增的,有一部分不是自增的,包含insert on duplicate key update语句

当innodb_autoinc_lock_mode=0时,采用AUTO_INC_Locking锁模式;当innodb_autoinc_lock_mode=1时,对于simple-insert采用互斥量对内存中的

计数器进行累加,对于Bulk-insert采用AUTO_INC_Locking表级锁,注意:如果已经使用AUTO_INC_Locking锁再执行simple-insert也要等待锁释放才
可以;当innodb_autoinc_lock_mode=2时,对于所有insert-like都是采用互斥量来计算计数器。

有三种行锁的算法,锁的算法:
1.Record Lock:单个记录上的锁
2.Gap Lock:间隙锁,锁定一个范围,但不包含记录本身
3.Next-key Lock:Record Lock+Gap Lock,锁定一个范围,并且锁定记录本身(innodb默认使用的是该锁计算方式)

锁带来的问题:
1.丢失更新:解决办法,在读取数据的时候加排他锁,这样事务2的读取必须等待事务1的排他锁释放才可以执行,加排他锁的方式:select for
update
2.脏读:读取到其他事务中未提交的修改数据,该问题在Read uncommited事务隔离模式下容易出现,这里要区别脏数据和脏页,脏页是指缓存池中修改的页还未刷新到磁盘,对于脏页的读取是正常的,脏页是数据库实例内存和磁盘的异步同步造成的,这不影响数据一致性,会带来性能的提升
3.不可重复读:在一个事务内多次读同一个数据可能读到不同的结果,该问题在Read commited事务隔离模式下会容易出现
4.阻塞:因为不同锁之间的兼容性,所以有时候一个事务会等待另一个事务释放资源,锁等待参数:innodb_lock_wait_timeout,该参数可以在mysql运行时动态修改,可以设置锁等待超时后是否进行回滚参数:innodb_rollback_waite_timeout,该参数是静态的,不能在mysql运行时修改
5.死锁:两个事务互相等待资源,innodb一个事务发生死锁后,会发生回滚并释放锁资源,innodb在大多数情况下不会回滚错误异常
6.锁升级:在innodb中,一个锁和10000个锁的开销都是一样的,都没用开销,所以不存在锁升级的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值