关于事务的ACID

这是关于数据库方面的知识,事务的ACID分别是指:
原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性(Consistency)
事务前后数据的完整性必须保持一致。
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

举几个简单的例子来解释一下四个特点

  1. 原子性(Atomicity)
    A对B转账
    A对B进行转账100元,要么失败,要么同时成功,这就是原子性。

  2. 一致性(Consistency)
    在这里插入图片描述
    假设A原本的账户是800元,B原本的账户是500元,通过A对B进行转账100元的操作后,A的账户应该是700元,B的账户应该是600元。一致性表示事务完成后,结果符合逻辑运算。

  3. 持久性(Durability)
    A向B转账100元
    操作前 A:800,B:500
    操作后 A:700,B:600
    如果在操作前(事务还没有提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
    A:800,B:500
    如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库以后,数据状态应该为
    A:700,B:600
    持久性就是表示事务结束后的数据不随着外界原因导致数据丢失。

  4. 隔离性(Isolation)
    针对多个用户同时操作,一个事务不会对另一个事务产生影响。
    在这里插入图片描述
    A对B转账的同时,C对B转账,此时,只有A对B的转账起了作用,因为这是AB事务排除了CB事务产生的影响,也就是说,经过一轮转账之后,B的账户是500+100=600元,而不是600+200=800元。但是注意,此时的C为1000-200=800元。

隔离性的拓展

1. 隔离级别

(1)read_uncommitted(读未提交)
可读取未提交事务的操作数据,最低的隔离级别,一般都没有用的。这种情况会出现脏读。

(2)read_committed(读已提交)
一个事务等另一个事务提交之后才可进行读取,解决了脏读问题,但会出现不可重复读。

(3)repeatable_read(可重复读)
读取事务开启的时候不能对数据进行修改,解决了不可重复读问题,但是存在幻读问题。

(4)serializable(序列化)
是最高的事务隔离级别,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

2.如何合理的选择隔离级别
可以根据需求设置数据库的事务的级别。“读未提交”一般没用,“读已提交”解决脏读但存在不可重复读,“可重复读”解决了脏读和不可重复读,但会出现幻读。串行化读,都可以解决,但是需要注意的是事务级别越高性能越低。
MySQL默认第三隔离级别。Oracle默认第二隔离级别。

3.脏读,幻读,不可重复读
在高并发的情况下,事务可能会出现:脏读,幻读,不可重复读。
以下的data是指数据库的名称

(1)脏读
出现原因:一个事务读取到了缓存中另一个事务未提交的脏数据。
例子:事务B对data进行了操作但是未提交事务,此时事务A对data进行读取,并使用事务B修改后的数据进行业务处理。

(2)幻读
出现原因:一个事务在读取数据时,另一个事务插入了数据,导致上个事务第二次读取数据时,数据不一致。
例子:事务A对data进行读取,假设此时只有一条数据,事务B对data新增一条数据,此时data实际上有两条数据,所以说事务A读取的数据,是虚幻的,称为幻读。

(3)不可重复度
出现原因:读取数据的同时可以进行修改。
例子:事务A、事务B同时对data进行访问,事务A对data进行读取,事务B对data进行修改,当事务A第一次对data进行读取完后事务B提交,此时当事务A第二次读取该数据时的数据就与第一次读取的数据不同,这种情况称为不可重复读。

4.以下是方便理解隔离级别会出现的问题
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值