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

事务的四个性质

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

事务并发三个问题

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

事务的四个隔离级别

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

MySQL锁

1、行锁:阻塞一行,对其他行没影响

MVCC对可重复读级别的一点

1.当begin一个事务,第一次查询一个数据,这个数据的值一定是刚刚其他事务提交后的值。也就是说已经开启了一个事务,在没有select的情况下,其他事务修改了A的值并提交,这时执行这个事务第一个select,查询这个A,A的值就是刚刚哪个事务提交的,而不是事务开启时A的值。select后会对A创建了一个快照,紧接着的select会直接找快照中的,而不是数据库的
2.之后再对A updata,updata的对像时数据库中的A,而不是MVCC创建的快照缓存中的A,比如快照中A的值时200,其他事务对A减了50并提交,数据库A的值就是150了,原先的事务在updata A-50,这时就会以数据库的值150,做操作,select一下时100,然后MVCC有创建了一个新的对A的快照版本。(有可能错误,仅供参考)

参考博客

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

猜你喜欢

转载自blog.csdn.net/qq_44477844/article/details/107944851
今日推荐