MySQL锁认识

锁是数据库系统区别于文件系统最大的关键特性;锁机制用于管理对共享资源的并发访问。

锁的分类:

共享锁(S Lock):允许事务读取一行数据;假如事务T1已经获得了r行的S锁,这时事务T2也可以获取r行的S锁,但是如果事务T3想获取r行的X锁,那就得等事务T1、T2都释放之后才可以。

排他锁(X Lock):允许事务删除或者修改一行数据

额外的意向锁:意向锁将锁定的对象分为多层次,意向锁意味着事务希望在更细的粒度上加锁。

一致性非锁定读

是指InnoBD存储引擎通过多版本并发控制(MVCC)读取当前正在执行数据库时间的行数据,如果读取的行正在做DELETE或者UPDATE操作,这时读取操作不会因此去等待行上的锁释放,而是InnoDB会读取行的快照,行的快照是是该行之前的版本,主要是根据undo段来完成。undo本身是用来事务中回滚数据,本身没有开销,所以一致性非锁定读大大提高了数据库并发性。

一致性锁定读

InnoDB存储引擎支持两种一致性锁定读,分别是:SELECT ... FOR UPDATE 对读取的行记录加一个X锁,其他的事务不能再对锁定的行加锁。SELECT ... LOCK IN SHARE MODE 对读取的行记录加一个S锁,其他的事务可以对这个行加S锁,但是如果加X锁,则会被锁定。

自增长与锁

自增长值的列并发插入性能较差,为了提高插入的性能,锁不是在事务提交之后才释放,而是在完成对自增长值插入的SQL语句后立即释放。InnoDB存储引擎提供了轻量级互斥量的自增长实现机制,大大提高了自增长插入的性能。

外键和锁

外键主要用于引用完整性的约束检查。InnoDB存储引擎中,如果没有给一个外键创建索引,那么InnoDB存储引擎会自动给加一个索引,因为这样可以避免表锁。对于外键的插入和更新操作,首先需要查询父表中的记录,对于父表中记录的查询不能使用一致性非锁定读,这样可能会造成数据不一致,所以只能使用SELECT ...LOCK IN SHARE MODE,如果这时父表中已经加了X锁,那么子表会就会被阻塞。

锁的算法

行锁的三种算法

Record Lock:单个行上加锁

Gap Lock:间隙锁,锁定一个范围,但不包含记录本身

Next-Key Lock:Gap Lock + Record Lock,锁定一个范围,并且包含记录本身

锁产生的问题

幻读:假如事务A对一个表中的全部行进行了修改,事务B向表中插入了一行,事务A发现表中还有没有修改的数据,仿佛出现了幻觉。Mysql默认的事务隔离级别 REPEATABLE READ,InnoDB存储引擎采用的是Next-Key Lock技术来避免幻读。

脏读:一个事务误读了另一个事务未提交的数据,而这个数据可能回滚。

不可重复读:一个事务范围内的两个相同查询返回了不同数据。如:事务A对某个查询执行了两次,当第一次执行完时,事务B对某数据进行了修改,事务A再次查询时,数据发生了变化。

丢失更新:两个事务同时读取一条记录,事务A先修改记录,事务B也修改记录(B不知道A修改过),B提交数据后,B的结果覆盖了A的修改结果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值