MySQL(二十)锁(一)锁概述、S锁和X锁
1 概述
-
锁
是计算机协调多个线程或进程并发访问某一资源的机制。 在程序开发过程中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是一些敏感的数据(如金额、订单等),就需要保证这个数据在任何时刻都最多只有一个线程在访问,以保证数据的一致性和完整性。
-
在开发过程中加锁就是为了保证数据的
一致性
。 -
锁机制也为MySQL各个
隔离级别
提供了保证。 -
锁冲突也是影响
数据库并发访问性能
的一个重要因素
2 MySQL并发事务访问相同记录
并发事务访问相同记录的情况主要有以下三种:
2.1 读读情况
即并发事务读取相同的记录,由于读取记录不会对记录产生任何影响,因此不会引起各种问题,所以允许这种情况的发生。
2.2 写写情况
即并发事务相继对相同的记录做出改动,这种情况下会发生脏写
,而脏写
在任何隔离级别下都是不被允许的,解决这一问题正是通过锁机制
,锁
其实是内存中的一种结构
,加锁的过程如下:
-
当一个事务想要对记录进行改动,首先会查看内存中有没有和记录做关联的锁结构
-
如果没有的话,就会生成一个锁结构与记录相关联,获取锁成功
-
有的话则表示该事务获取锁失败,也会生成一个锁结构与记录关联,并设置
is_waiting
表示获取锁失败 .
-
事务提交后,会将由该事务生成的锁结构释放掉,然后看看还有没有别的事务在等待获取锁,如果有则将其
is_waiting
改为false,并将该事务对应的线程唤醒
锁结构内的信息有很多,主要的信息有:
trx信息
:记录是哪个事务产生的锁结构is_waiting
:代表当前事务是否在等待
2.3 读写或者写读情况
即一个事务执行读操作,另一个事务执行改动操作,这种情况下可能会发生脏读
、不可重复读
和幻读
问题。