事务的四大性质和事务的隔离级别

事务是数据库操作的基本单元,确保原子性、一致性和隔离性。四种隔离级别防止并发问题,如脏读、不可重复读和幻读。MySQL默认隔离级别为读已提交,Oracle仅支持读已提交和串行化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么事事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行结果将使数据库从一种一致性状态变迁到另一种一致性状态。 事务是逻辑上的一组操作,要么全部执行成功,要么全部不执行成功

1. 原子性

事务的最小执行的执行的单位,不允许分割。事务的原子性确保动作要么全部成功,要么全部不成功

例如: 银行转账, A 账户 有 1000 元, B 账户也有1000元,,A 转 100 给 B账户,要么 A账户剩余900,B 账户 为1100元,要么就都为1000元,不会出现其他的情况,要就全部成功,要么全部失败

2. 一致性

执行事务前后,数据保持一致性,多个事务对同一数据读取的结果是相同的

例如: 银行转账, A 账户 有 1000 元, B 账户也有1000元,A 转 100 给 B账户,中途不管怎么操作,A和 B 账户的总和都是 2000

3. 隔离性

并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的

4.持久性

一个事务被提交之后。他对数据库的改变是持久的,即使是数据库发生故障也不应该 对其收到影响

数据库 的隔离级别

1. 读未提交(Read Uncommitted)

最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读,幻读,不可重复读

2. 读以提交(Read Committed)

允许读取并发事务以提交的数据,可以阻止脏读,但是幻读或不可重复读任有可能发送

3. 可重复读(Repeatable Read)

对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复度,但是任然有可能发送幻读

4 可串行化(Serializable)

最高的隔离级别,完全服从ACID 的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读,不可重复读,以及幻读

上面所列的隔离级别是从低到高,级别越高消耗的性能越大
以上是 MySQL 中 的隔离级别,而Oracle 数据库中 只有 读以提交和 可串行化 2种隔离级别
mysql中 默认的隔离级别是 读以提交(Read Committed)

脏读(Drity Read)

某个事务更新一份数据,另一个事务此时读取了同一份事务,由于默写原因,前一个事务回滚了,后面一个事务所读取的数据就会是不正确的
例如: 2个用户从同一个账户取钱(这个账户中有1000块),第一个用户取钱的时候(查询到余额是1000块),并且开启了一个事务,然后执行一系列操作将数据库里面的金额扣减了500块,然后第二个人也来取钱,但是他读取到的是 这个账户只有 500 块钱了(读取到第一个事务没有提交的数据),然后第一个用户因为一系列操作出现了问题,然后RollBac了,然后就导致第二个用户读取的数据不正确

不可重复读(Non repeatable read)

在一个事务中 2次查询之中数据不一样,可能是2次查询过程中间插入了一个事务更新的原有数据。

例如:2个用户操作同一个账户(账户中有1000块),2个用户同时去取钱,并且同时去查询用户有多少钱,并且同时查到的都是1000块,然后第一个用户去取钱开启了事务,第二个用户也去取钱,也开始了事务,但是在第二个用户提交事务之前,第一个事务就已经提交了事务,将账户中的钱就更改了,然后就出现了不可重复读

幻读

事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值