ACID特性

数据库管理系统中事务(transaction)的四个特性(分析时根据首字母缩写依次解释):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)

所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。(执行单个逻辑功能的一组指令或操作称为事务)

详解

1. 原子性

原子性是指事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。

可采用“A向B转账”这个例子来说明解释

在DBMS中,默认情况下一条SQL就是一个单独事务,事务是自动提交的。只有显式的使用start transaction开启一个事务,才能将一个代码块放在事务中执行。

2. 一致性

一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。

如A给B转账,不论转账的事务操作是否成功,其两者的存款总额不变(这是业务逻辑的一致性,至于数据库关系约束的完整性就更好理解了)。

保障机制(也从两方面着手):数据库层面会在一个事务执行之前和之后,数据会符合你设置的约束(唯一约束,外键约束,check约束等)和触发器设置;此外,数据库的内部数据结构(如 B 树索引或双向链表)都必须是正确的。业务的一致性一般由开发人员进行保证,亦可转移至数据库层面。

3. 隔离性

多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。

在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据。

事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。

关于隔离性中的事务隔离等级(事务之间影响),参见相应博文

4. 持久性

这是最好理解的一个特性:持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)

write ahead logging:SQL Server中使用了WAL(Write-Ahead Logging)技术来保证事务日志的ACID特性,在数据写入到数据库之前,先写入到日志,再将日志记录变更到存储器中。

### ACID特性在数据库事务中的作用 ACID特性是数据库事务的基础,确保了数据一致性和可靠性。具体来说: #### 原子性 (Atomicity) 原子性表示事务是一个不可分割的工作单位,其中的操作要么全部完成,要么完全不执行。这种特性可以有效防止因系统崩溃或其他异常情况而导致的部分操作被执行的情况[^1]。 例如,在银行转账过程中,如果从账户A向账户B转移金额的过程中发生中断,则可能导致资金丢失或重复记账。通过原子性,能够保证整个过程的成功或者回滚到初始状态。 #### 一致性 (Consistency) 一致性要求事务的执行必须使数据库从一个合法的状态转换到另一个合法的状态。这意味着任何违反约束条件(如外键关系、唯一性等)的操作都会被阻止[^3]。对于超卖问题而言,保持商品数量字段始终处于合理范围内就是一种典型的一致性体现——即不允许库存变为负数。 #### 隔离性 (Isolation) 隔离性是指多个并发运行的事务互不影响,每个事务看起来像是单独执行一样。这有助于避免诸如脏读、不可重复读等问题的发生[^4]。当处理电商网站上的抢购活动时,良好的隔离级别可以帮助减少由于高并发请求引发的数据竞争现象,从而降低出现超卖的可能性。 #### 持久性 (Durability) 一旦事务提交成功,其所做的更改就应永久保存下来,即便之后发生了硬件故障也不例外[^5]。持久化保障了即使面对意外断电等情况也能维持已确认的结果不变形。 --- ### 解决超卖问题的方法 利用ACID特性来应对超售挑战主要集中在以下几个方面: 1. **借助锁机制增强隔离性** - 使用悲观锁(`SELECT ... FOR UPDATE`)锁定即将修改的商品记录直到当前事务结束为止。这样其他试图对该条目做相同改动的行为会被阻塞直至前者的释放。 ```sql START TRANSACTION; -- 加锁查询目标产品剩余库存量 SELECT stock FROM products WHERE id = ? FOR UPDATE; IF(stock >= required_amount){ UPDATE products SET stock = stock - required_amount WHERE id = ? ; COMMIT; }ELSE{ ROLLBACK; } ``` 2. **提升事务隔离等级至SERIALIZABLE** - 尽管较高的隔离度可能会带来性能开销增加的风险,但它确实能最大程度地杜绝各种幻读和写偏斜状况,进而间接缓解某些类型的超买隐患[^2]。 3. **引入乐观锁策略** - 在每笔交易里附加版本号列(version),每次更新之前先验证最新值是否匹配预期旧版。如果不符则表明存在竞态条件需重新尝试。 ```java int affectedRows = jdbcTemplate.update( "UPDATE products SET stock=stock-?, version=?+1 WHERE id=? AND version=?", purchaseQuantity, currentVersion, productId, currentVersion); if(affectedRows==0){ throw new OptimisticLockingFailureException(); } ``` 综上所述,通过对ACID特性的充分理解和运用,特别是加强隔离措施以及采用合适的同步手段,可以在很大程度程度上规避掉电子商务领域常见的超卖难题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值