数据库事务Transaction
事务是数据库操作的基本逻辑单位
事务的语法
Begin transaction
....
commit;
rollback;
End transaction
事务的ACDI特性
原子性:Atomic 操作的最小逻辑单位,要么都做,要么都不做。
一致性:Consistent 完整性约束
持久性:Durability 修改是永久的,即便数据库发生重启、故障恢复也应该保持数据不变
隔离性:Isolation 事务的并发执行互不影响
事务并发执行带来的问题
问题1:丢失修改(售出2张票,数据库中只减少了1张)
时间 | T1 | T2 |
t1 | read(A)[16] | |
t2 | read(A)[16] | |
t3 | A=A-1 | |
t4 | A=A-1 | |
t5 | write(A)[15] | |
t6 | write(A)[15] |
问题2:都脏数据
时间 | T1 | T2 |
t1 | read(A)[16] | |
t2 | A=A-1 | |
t3 | write(A)[15] | |
t4 | read(A)[15] | |
t5 | ROLLBACK[16] |
问题3:不可重复读
时间 | T1 | T2 |
t1 | read(A)[16] | |
t2 | read(A)[16] | |
t3 | A=A-1 | |
t4 | write(A)[15] | |
t5 | read(A)[15] |
数据库的并发控制
排他锁(X锁)事务T对数据A加上X锁之后,只允许T读取和修改数据A, 其他事务对数据A不能再加任务锁,即不能再对数据A进行读写操作,直到事务T释放A上的锁。
共享锁(S锁) 事务T对数据A加上S锁之后。 就只能读取A但不可以修改,其他事务也可以对A加S锁来读取。只要A上有S锁,任何事务就只能加S锁不能加X锁。
封锁协议
三级封锁协议
(1)一级封锁协议:加X锁,解决丢失修改的问题。
(2)二级封锁协议:加S锁,解决读脏数据的问题。读完即释放S锁
(3)三级封锁协议:加S锁, 解决不可重读的问题。事务结束再释放S锁
两段锁协议
事务在读写数据之前必须加锁,释放锁之后不能再加任何锁。
严格遵守拓展阶段加锁,收缩阶段释放锁。
事务的隔离级别
事务的并发执行破坏了事务的隔离性,通过封锁协议对其进行限制,不同粒度的锁和多粒度的封锁使事务有4种不同的隔离级别。
(1) Read uncommitted(读未提交) ----> 对应一级封锁协议
(2)Read committed(读已提交) -----> 对应二级封锁协议
(3)Repeatable read(可重复读) ------> 对应三级封锁协议
(4)Serializable(可串行化), 最高的事务隔离级别
1,2,3,4隔离级别逐渐增强