数据库的控制功能主要指对数据库中数据的管理和维护,确保数据的安全性、完整性和一致性。数据库控制功能主要包括:并发控制、性能优化、完整性约束、以及备份与恢复。
+一、并发控制
1. 事务
DBMS 运行的基本工作单位是事务,事务是用户定义的一个数据库读写操作序列,这些操作序列要么全做,要么全不做,是一个不可分割的工作单位。
+事务具有以下四个基本特性,通常被称为ACID 特性:
+-
+
- 原子性(Atomicity):事务中的所有操作是一个不可分割的整体,要么全部完成,要么全部不完成,不能部分地完成。一旦某一步执行失败,就会全部回滚到初始状态。 +
- 一致性(Consistency):事务必须使数据库从一个一致性状态转换到另一个一致性状态。这意味着事务执行过程中和执行结束后,数据库中的数据必须满足所有预定义的规则和约束。 +
- 隔离性(Isolation):一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的事务之间不会相互影响。多个事务并发运行,但看上去像串行调度执行一样。 +
- 持久性(Durability):一旦事务被提交,它对数据库的修改就是永久性的,即使系统发生故障也不会丢失。 +
一致性是事务 ACID 四大特性中最重要的属性,而 原子性、隔离性和持久性,都是作为保障一致性的手段。
+2. 数据不一致
如果数据不一致,那么在并发“读 - 写”或并发“写 - 写”的场景,容易出现以下问题:
+(1) 修改丢失
T1 和 T2 两个事务都对一个数据进行修改,T1 先修改,T2 随后修改,T2 的修改覆盖了 T1 的修改。
+T1 | +T2 | +
---|---|
读 A=10 | ++ |
+ | 读 A=10 | +
A=A-5,写回 | ++ |
+ | A=A-8,写回 | +
T1 对 A 的修改被 T2 覆盖,T1 的修改不起作用。
+(2) 脏读
T1 修改一个数据,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。
+T1 | +T2 | +
---|---|
读 A=20 | ++ |
A=A+50,写回 | ++ |
+ | 读 A=70 | +
rollback | ++ |
A=20,写回 | ++ |
T1 对 A 进行修改,但之后回滚撤销,T2 读取的数据与数据库中不一致,是错误的数据(脏数据)。
+(3) 不可重复读
T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。
+T1 | +T2 | +
---|---|
读 A=20 | ++ |
读 B=30 | ++ |
计算 A+B=50 | ++ |
+ | 读 A=20 | +
+ | A=A+50,写回 | +
读 A=70 | ++ |
读 B=30 | ++ |
计算 A+B=100 | ++ |
T1 读取数据并进行计算,T2 更新了数据,T1 再次读取数据,然而计算结果不一致。
+(4) 幻读
T1 读取某个范围的数据,T2 在这个范围内插入或删除数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。
diff --git a/archives/2024/10/index.html b/archives/2024/10/index.html index 908fa7a..ba402e9 100644 --- a/archives/2024/10/index.html +++ b/archives/2024/10/index.html @@ -243,7 +243,7 @@数据库的并发控制、性能优化、以及备份和恢复
+数据库的并发控制、性能优化、以及备份和恢复
阅读全文 diff --git a/archives/2024/index.html b/archives/2024/index.html index 0e55e5b..1e2ec5b 100644 --- a/archives/2024/index.html +++ b/archives/2024/index.html @@ -243,7 +243,7 @@数据库的并发控制、性能优化、以及备份和恢复
+数据库的并发控制、性能优化、以及备份和恢复
阅读全文 diff --git a/archives/index.html b/archives/index.html index d2ba28f..a063e81 100644 --- a/archives/index.html +++ b/archives/index.html @@ -243,7 +243,7 @@数据库的并发控制、性能优化、以及备份和恢复
+数据库的并发控制、性能优化、以及备份和恢复
阅读全文 diff --git a/index.html b/index.html index 71fb345..06e45e8 100644 --- a/index.html +++ b/index.html @@ -242,7 +242,7 @@数据库的并发控制、性能优化、以及备份和恢复
+数据库的并发控制、性能优化、以及备份和恢复
阅读全文 diff --git "a/tags/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/index.html" "b/tags/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/index.html" index 6f319ea..2306faa 100644 --- "a/tags/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/index.html" +++ "b/tags/\346\225\260\346\215\256\345\272\223\350\256\276\350\256\241/index.html" @@ -243,7 +243,7 @@数据库的并发控制、性能优化、以及备份和恢复
+数据库的并发控制、性能优化、以及备份和恢复
阅读全文 diff --git "a/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" "b/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" index 3c41334..5a5c591 100644 --- "a/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" +++ "b/tags/\350\275\257\344\273\266\345\267\245\347\250\213/index.html" @@ -243,7 +243,7 @@