事务的特性 ACID与事务的隔离级别

本文深入探讨了数据库事务的四大核心特性ACID,即原子性、一致性、隔离性和持久性,详细解释了每种特性的含义及作用,并讨论了事务的隔离级别如何影响并发处理,避免脏读、不可重复读和幻读等问题。

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

事务的特性 ACID

数据库的事务必须具备ACID特性,ACID是指 Atomic(原子性)、Consistensy(一致性)、Isolation(隔离型)和Durability(持久性)的英文缩写。

原子性(Atomicity)

事务包装的一组sql,要么都执行成功,要么都失败。这些操作是不可分割的。

一致性(Consistency)

数据库的数据状态是一致的。

事务的成功与失败,最终数据库的数据都是符合实际生活的业务逻辑。一致性绝大多数依赖业务逻辑和原子性。

持久性:(Durability

事务成功提交之后,对于数据库的改变是永久的。哪怕数据库发生异常,重启之后数据亦然存在。

隔离性(Isolation)

一个事务的成功或者失败对于其他的事务是没有影响。2个事务应该相互独立。

事务的隔离级别

如果不考虑事务的隔离性,由于事务的并发,将会出现以下问题:

1、脏读 -- 最严重,杜绝发生

2、不可重复读

3、幻读(虚读)

查询数据库的隔离级别

select @@tx_isolation;

设置数据库的隔离级别

         set session transaction isolation level 级别字符串

         级别字符串:read uncommitted、read committed、repeatable read、serializable

例如:set session transaction isolation level read uncommitted;

​​​​​​​隔离级别:解决问题

数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。

  1. read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。
    1. 存在:3个问题(脏读、不可重复读、虚读)。
    2. 解决:0个问题
  2. read committed 读已提交,一个事务读到另一个事务已经提交的数据。
    1. 存在:2个问题(不可重复读、虚读)。
    2. 解决:1个问题(脏读)
  3. repeatable read(): 可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。
    1. 存在:1个问题(虚读)。
    2. 解决:2个问题(脏读、不可重复读)
  4. serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
    1. 存在:0个问题。
    2. 解决:3个问题(脏读、不可重复读、虚读)
  1. 安全和性能对比
    1. 安全性:serializable > repeatable read > read committed > read uncommitted
    2. 性能 : serializable < repeatable read < read committed < read uncommitted
  2. 常见数据库的默认隔离级别:
    1. MySql:repeatable read
    2. Oracle:read committed

在mysql数据库中,底层对于幻读做了优化,无法展示。

脏读:指一个事务读取了另外一个事务 未提交的数据

不可重复读:在一个事务内多次读取表中的数据,多次读取的结果不同。

和脏读的区别: 不可重复读是读取的已提交数据

例如: 银行想查询A账户的余额,第一次查询的结果是200元,A向账户中又存了100元。此时,银行再次查询的结果变成了300元。两次查询的结果不一致,银行就会很困惑,以哪次为准。

​​​​​​​幻读(虚读)

虚读和不可重复读的区别:

虚读 强调的是数据表 记录数 的变化,主要是 insert 和 delete 语句。

不可重复读 强调的是数据表 内容 的变化,主要是 update 语句。

指在一个事务中 读取 另一个事务 插入或删除 数据记录,导致当前事务 读取数据前后不一致。

丙 存款100元但未提交,这时银行做报表 统计总额为500元,丙将事务提交,银行再统计就变成了 600元,两次统计结果不一致,银行便会不知所措。

一个事务 读取 另一个事务 已经提交的数据,强调的是 记录数 的变化,常有sql类型为 insert和 delete。

​​​​​​​serializable 串行化

上述所有的问题都是 事务 并行执行引起的,所以改成所有事务依次执行(串行),可以避免所有的问题。数据库执行这个事务,其他事务必须等待当前事务执行完毕,才能被执行。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值