数据库的基本性质(五) | 青训营笔记

139 阅读3分钟

这是我参与「第三届青训营 - 后端场」笔记创作活动的的第五篇笔记。

1. 事务(Transaction)

概念:是由一组SQL语句组成的一个程序执行单元(Unit),它需要满足ACID特性。
ACID:
原子性(Atomicity):事务是一个不可再分割的工作单元,事务中的操作要么都发生,要么都不发生。
一致性(Consistency):数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
隔离性(Isolation):多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其他事务运行结果。
持久性(Durability):在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

2. 并发一致性问题

在并发环境下,事务的隔离性很难保证,因此会出现很多并发一致性问题。

2.1 丢失修改

T1事务和T2事务同时进行更新操作同一个数据,T1在前,T2在后,T2的修改覆盖了T1的修改。

2.2 读脏数据

读脏数据指在不同的事务下,当前事务可以读到另外事务未提交的数据。例如:T1 修改一个数据但未提交,T2 随后读取这个数据。如果 T1 撤销了这次修改,那么 T2 读取的数据是脏数据。

2.3 不可重复读

不可重复读指在一个事务内多次读取同一数据集合。在这一事务还未结束前,另一事务也访问了该同一数据集合并做了修改,由于第二个事务的修改,第一次事务的两次读取的数据可能不一致。例如:T2 读取一个数据,T1 对该数据做了修改。如果 T2 再次读取这个数据,此时读取的结果和第一次读取的结果不同。

2.4 幻读

幻读本质上也属于不可重复读的情况,T1 读取某个范围的数据,T2 在这个范围内插入新的数据,T1 再次读取这个范围的数据,此时读取的结果和和第一次读取的结果不同。与不可重复读不同的是,前者是读了更新的数据内容,后者是读了更新的数据项

3. 封锁

3.1 封锁类型

3.1.1 读写锁

  • 互斥锁(Exclusive),简写为 X 锁,又称写锁。
  • 共享锁(Shared),简写为 S 锁,又称读锁。 有两个规定:
    1)T 拿到 X 锁的时候,其他的读写数据的请求都要隔离。 2)T 拿到 S 锁的时候,其他的更新数据的请求都要隔离。\

XS锁兼容关系

XS
X
S

3.1.2 意向锁

在T对数据加入X锁或者S锁之前要拿到意向锁,确认没有别的事务对数据表和某行数据进行操作意向。

4. 隔离级别

4.1 未提交读(READ UNCOMMITTED)

事务中的修改,即使没有提交,对其它事务也是可见的。

4.2 提交读(READ COMMITTED)

一个事务只能读取已经提交的事务所做的修改。换句话说,一个事务所做的修改在提交之前对其它事务是不可见的。解决脏读。

4.3 可重复读(REPEATABLE READ)

保证在同一个事务中多次读取同一数据的结果是一样的。解决不可重复读,脏读。

4.4 可序列化(SERIALIZABLE)

强制事务串行的执行,并且通过锁来规定同一时间执行的事务只有一个,规定好了执行的秩序。解决脏读、不可重复读、幻读。

隔离级别能解决的并发一致性问题

脏读不可重复读
未提交读
提交读
可重复读
可序列化

只有可序列化可以解决幻读的问题