数据库隔离与锁知识点汇总

事务的四个性质

1、原子性:事务中的所有操作要么不执行,要么都执行
2、一致性:数据遵循守恒,a向b转了100,事务结束后必定是a少了100,b多了100
3、隔离性多个事务并发执行的化,必定和穿行执行的效果一样
4、持久性:事务在执行结束后,对数据库的影响是永久的

事务并发三个问题

1、脏读:不同事务,一个事务读了另一个事务没有提交的数据
2、不可重复读:多次读取同一个数据的结果不一样。即在连续的俩次读取之间,有一事务对这一数据做了修改并提交了
3、幻读:一事务对表某范围的数据做修改,另一事务对该表做插入,插入的数据刚好符合上一事务的范围,上一事务的用户发现还有没有修改的数据。

事务的四个隔离级别

1、读未提交:读到没有提交的数据。存在脏读,幻读,不可重复读问题
2、读提交:只能读到已经提交的数据。存在不可重复读,幻读问题
3、可重复度:事务开启时就不允许对该数据做修改操作,即给第一个updata操作加行锁。存在幻读问题,因为幻读是对数据删除或者修改。(MySQL默认级别)
4、串行化:一个事务执行完了另一个事务才能执行。解决三个问题,但是效率奇差。

MySQL锁

1、行锁:阻塞一行,对其他行没影响
一、按读写分类
1、读锁(S锁):共享锁,加锁后,其他事物可以读,可以加读锁但不可以写,不可以加写锁
select。。。lock in share mode
将查找到的数据加读锁,其他事务可以查到该数据,并也可以给这条数据加读锁。
应用场景:读出数据后,其他事务不能修改,但自己也不一定能修改,因为其他事务也可以加读锁。
2、写锁:排他锁。加锁后其他事务不能加读锁也不能加写锁。但是select可以通过。
select。。。for update
另外,insert,update,delete也加了写锁
应用场景:只有自己这个事务可以修改该数据。
事务commit或rollback就可释放锁
可重复读级别下for update解决幻读:
事务查询select。。。for update并用到索引,会对查到的字段和间隙加写锁。没用到索引,会对表中所有记录及间隙加写锁,因为不加锁你会修改某一行使之满足查询条件,再次查询的时候依然会产生幻读现象

MVCC对可重复读级别的版本快照

1.当begin一个事务,第一次查询一个数据,这个数据的值一定是刚刚其他事务提交后的值。也就是说已经开启了一个事务,在没有select的情况下,其他事务修改了A的值并提交,这时执行这个事务第一个select,查询这个A,A的值就是刚刚那个事务提交的,而不是事务开启时A的值。select后会对A创建了一个快照,紧接着的select会直接找快照中的,而不是数据库的
红色的标号表示sql执行顺序。
例子中事务开启时,A的值是4,之后其他事务给A-1;左边的事务select,值为当前数据库的值
在这里插入图片描述

2.之后再对A updata,updata的对像是数据库中的A,而不是MVCC创建的快照缓存中的A,也就是说,当事务update,MVCC会更新快照。比如快照中A的值时200,其他事务对A减了50并提交,数据库A的值就是150了,原先的事务在updata A-50,这时就会以数据库的值150,做操作,select一下时100,然后MVCC有创建了一个新的对A的快照版本。(有可能错误,仅供参考)
接着上一个例子,开始数据库的值为3,左边事务更新并提交,此时数据库A为2,右边事务再更新,A的值是当前数据库中A的值2,而不是3;
在这里插入图片描述
其实MVCC会维护一个存储了当前活跃事务id的数组,当事务update的时候,MVCC会增加一个快照版本,当事务提交之后,就会从活跃事务id的数组中删除。
而该事务没更新,不管其他事务如何更新,该事务的A永远是当前版本的A。我觉得第一次事务快照的版本是根据事务第一次使用select的值建立的。

在这里插入图片描述

参考博客

数据库事务隔离级别
数据库事务隔离,脏读、幻读、不可重复读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值