【校招VIP】数据库的四个隔离级别

05月12日 收藏 0 评论 1 java开发

【校招VIP】数据库的四个隔离级别

转载声明:文章来源https://zhuanlan.zhihu.com/p/500817680

事务的四大特性:ACID

A:原子性
每个事务的操作是一个整体,不可再分割,要么都成功,要么都失败。利用undo log回滚。

C:一致性
数据库只能从一个有效(正确)的状态转换到另外一个有效(正确)的状态。一致性是目的,原子性隔离性持久性都是为了一致性。这个状态约束可以是数据库创建时设定的,如账户表的余额字段,设置约束必须大于等于0,那在执行过程后,如果计算操作后该值小于0,则会报错,应为这个是打破了约束规则。也可以的用户业务层控制的。比如A、B账户余各为100,A向B转账50,结果有效(正确)状态要么是A100、B100要么A50、B150,不可能A50B100。

I:隔离性
各个事务之间不应该相互影响,是独立的操作。

D:持久性
事务提交后,对数据的修改是永久性的。因为结果是记录上电脑存储设备上。redo log

事务的隔离级别

1、读未提交(read uncommitted)
2、读已提交(read committed)
3、可重复读(repeatable read)
4、串行化(seriazliable),用加锁来实现,是串行单事务的,只能一个事务一个事务来处理。效率最低。

读未提交,事务A读取到事务B未提交的数据。例子,乙向甲转账100元,乙还没提交事务,此时甲查询账户余额显示多了100元。通过数据库客户端执行sql语句修改数据、java操作数据库都是默认都是自动提交事务的,在客户端执行sql测试读未提交场景,设置为手动提交set autocommit=0

并发事务可能出现的问题

1、脏读
事务A读到事务B没提交的事务,如上面转账例子,甲查看到多了100,但是乙转账事务还没有提交,可能最后事务回滚了(但是甲有段时间查询到账户是多了100)

2、不可重复读
事务A(同一个事务中)读到事务B已经提交的数据,事务A受到事务B的影响。

3、幻读
查询出新的插入行数据,事务A中执行同一查询条件的两次查询,后一次查询查到第一次查询没有看到的行。如事务A的两次查询a1、a2查询,在a1和a2查询之间,事务B插入了数据导致a2查询的结果存在a1没有的数据行。

不可重复读和幻读都是读取到了其他事务提交的数据,区别在于不可重复读是同一数据项(比如同一个行某个字段的值前后不同)、幻读是针对一批整体数据(比如不同行数)

行锁
间隙锁
PS:快照读(普通读)、当前读

C 1条回复 评论
我吃小朋友

文采四溢,大佬这是被耽搁的文学家啊!

发表于 2022-07-27 21:00:00
0 0