数据的四大特性

事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
1 .原子性 
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 
2 .一致性 
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 .隔离性 
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 
4 .持续性 
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。 
 

转载于:https://www.cnblogs.com/wuyepeng/p/9740169.html

### MySQL ACID 四大特性详解 #### 1. 原子性(Atomicity) 原子性确保事务中的所有操作要么全部成功,要么全部失败。如果事务在执行过程中发生错误,则会回滚到事务开始之前的状态。MySQL 的 InnoDB 存储引擎通过 **undo log** 实现了原子性[^4]。当事务进行修改时,InnoDB 会将修改前的数据写入 undo log 中,以便在事务失败时可以恢复到原始状态。 ```sql -- 示例:一个包含多个操作的事务 START TRANSACTION; INSERT INTO users (name, age) VALUES ('Alice', 25); UPDATE accounts SET balance = balance - 100 WHERE user_id = 1; COMMIT; ``` 如果上述事务中的任何一条语句失败,整个事务会被回滚,确保数据的一致性。 --- #### 2. 一致性(Consistency) 一致性保证数据库始终从一个一致状态转换到另一个一致状态。事务不会破坏数据库的完整性约束,如主键、外键和唯一性等。一致性依赖于原子性、持久性和隔离性的共同作用。InnoDB 通过事务日志和锁机制来确保一致性[^4]。 例如,在更新银行账户余额时,如果转账金额不足,事务会因违反一致性规则而被回滚。 ```sql -- 示例:转账事务 START TRANSACTION; UPDATE accounts SET balance = balance - 50 WHERE account_id = 1; UPDATE accounts SET balance = balance + 50 WHERE account_id = 2; COMMIT; ``` 如果账户 1 的余额不足以完成转账,事务将被回滚,以保持数据的一致性。 --- #### 3. 隔离性(Isolation) 隔离性确保并发事务之间互不干扰。MySQL 的 InnoDB 存储引擎通过 **MVCC(多版本并发控制)** 和 **锁机制** 实现了不同级别的隔离性。常见的隔离级别包括: - **读未提交(Read Uncommitted)**:允许脏读。 - **读已提交(Read Committed)**:只允许读取已经提交的数据。 - **可重复读(Repeatable Read)**:默认隔离级别,确保同一事务中多次读取的结果一致。 - **串行化(Serializable)**:最高的隔离级别,完全杜绝并发问题。 以下是一个使用 MVCC 的示例: ```sql -- 示例:在可重复读隔离级别下查询数据 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; SELECT * FROM users WHERE id = 1; -- 第一次查询 -- 其他事务插入或修改数据 SELECT * FROM users WHERE id = 1; -- 第二次查询结果与第一次相同 COMMIT; ``` 通过 MVCC,InnoDB 可以为每个事务提供快照视图,避免了幻读等问题。 --- #### 4. 持久性(Durability) 持久性确保一旦事务提交,其对数据库的更改将永久保存,即使系统发生故障也不会丢失。MySQL 的 InnoDB 存储引擎通过 **redo log** 实现了持久性。在事务提交时,InnoDB 会先将 redo log 写入磁盘,然后再异步地将数据页刷新到磁盘中。 以下是一个简单的事务提交过程: ```sql -- 示例:提交事务 START TRANSACTION; INSERT INTO logs (message) VALUES ('Transaction started'); COMMIT; ``` 在 `COMMIT` 操作完成后,即使系统崩溃,redo log 也能保证数据的持久性。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值