数据库事务的四大特性ACID
事务
数据库事务(简称:事务)是数据库管理系统执行过程中的一个逻辑单元,由一个有限的数据库操作序列构成。——维基百科
简而言之:一系列数据库操作语句组成事务。
简介
数据库事务具有四个基本特性,分别是ACID(原子性automicity、一致性Consistency、隔离性isolation和持久性durability)。
原子性(Automicity)
概念
原子性(Automicity):事务是一个不可分割的工作单位,事务中的所有操作要么全部完成,要么全部不完成,不会出现部分完成的情况。如果再事务过程中发生错误,会将事务中所有已经执行的操作撤销(回滚Rollback)。
例子:
假设有一个银行转账业务,其中需要更新两个账户的余额。如果这两个操作没有被作为一个原子操作来执行,那就可能出现数据不一致的情况。例如,当转出账户的余额已经被减去了一定数额,但由于某些原因(如系统故障、断电等),转入账户的余额没有被增加,此时就会出现数据不一致的情况。
因此,在这个例子中,将更新两个账户的余额的操作作为一个原子操作,确保这两个操作要么全部执行,要么全部不执行,以保证数据的一致性。如果其中任何一个操作失败,整个事务都应该回滚,保证事务的原子性。
一致性(Consistency)
概念
一致性(Consistency):事务执行的结果必须使数据库从一个一致性状态变为另一个一致性状态。一致性是指数据的完整性和业务逻辑的正确性。
例子:
假设一个订单系统,其中一个订单包含了多个商品的信息和总价。为保证系统的一致性,订单的总价应该等于各个商品的价格总和。
如果再多个事务同时修改订单中的商品价格,就可能导致订单的总价与商品价格总和不一致,从而破坏了数据的一致性。为了解决这个问题,需要对这些修改操作进行协调和同步,使得任何时刻订单的总价都等于各个商品价格总和。
在这个例子中,可以采用锁机制来保证数据的一致性。在修改订单中商品价格的时候,需要先对订单进行加锁,防止其他事务修改订单中的商品信息,直到本事务完成修改操作并释放锁之后,其他事务才能继续对订单进行操作,从而保证数据的一致性。
隔离性(Isolation)
概念
隔离性(Isolation):多个事务并发执行时,每个事务都应该感觉不到其他事务的存在,各个事务之间应该是隔离的。事务之间的隔离级别会导致不同的并发问题,如脏读、不可重复读和幻读问题。(具体概念例子可以参考博主其他文章《数据库事务四种隔离级别》、《脏读、不可重复读和幻读》)
例子
假设一个银行系统中,用户A和用户B都有各自的账户,并且他们的账户都有1000元的余额。现在用户A向用户B转账500元。这个转账操作会涉及到两个账户的余额的变动,需要使用数据库事务来保证转账操作的正确性。
在这个转账操作的过程中,如果没有适当的隔离级别,就可能出现一下情况:
- 脏读:用户A转账500元之后,但还没提交事务,此时用户B可以读取到账户的变动,但这个变动可能是不可能靠的,因为他随时可能会被回滚。
- 不可重复读:用户B在读取账户的余额之后,用户A又取消了这次转账操作并提交了业务,此时用户B再次读取账户的余额,就会发现和之前读取到的不一样。
- 幻读:假设在转账操作中,还有一个触发器会自动从用户A和用户B的账户中扣除一定的手续费。如果用户A和用户B同时在转账操作中扣除了手续费,就可能出现幻读的情况,即用户A和用户B同时读取到了旧的余额,但在提交事务时却发现总的余额不对。
为了避免这些问题,可以用数据库的隔离级别来保证转账操作的正确性。例如,可以使用串行化隔离级别来保证转账操作的原子性、一致性和隔离性,从而避免脏读、不可重复读和幻读的问题。
持久性(Durability)
概念
持久性(Durability):一个事务一旦提交,他对数据库中的数据的改变就应该是永久性的。即使出现宕机或者其他异常情况,数据库系统应该能够保证事务的持久性。
例子
例如一个用户注册功能的实现。
当一个用户在应用程序中注册时,这个操作需要保证其持久性。也就是说,一旦用户注册成功,用户的信息应该被持计划的存储在数据库中,以便在用户下一次登录时可以被检索到。
这个过程需要确保事务的持久性特性,即在用户注册成功后,事务被提交并将数据持久化到数据库中,即使在应用程序或数据库出现故障或重启的情况下,用户数据也能得到保留,不会丢失。
猜你喜欢
- 3小时前VUE登录注册页面,完整vue,直接复制
- 3小时前防火墙部署安全区域
- 3小时前【论文阅读】Deep Graph Contrastive Representation Learning
- 3小时前数据湖架构Hudi(二)Hudi版本0.12源码编译、Hudi集成spark、使用IDEA与spark对hudi表增删改查
- 3小时前计算机毕业设计 基于Hadoop的物品租赁系统的设计与实现 Java实战项目 附源码+文档+视频讲解
- 3小时前【车载开发系列】诊断故障码DTC中的扩展数据信息
- 3小时前Java 栈和队列的交互实现
- 3小时前[Halcon&3D] 3D手眼标定理论与示例解析
- 3小时前3D Gaussian Splatting:用于实时的辐射场渲染
- 17分钟前悉知是什么意思(悉知是什么意思?知悉又是什么意思?)
网友评论
- 搜索
- 最新文章
- 热门文章