数据库是一个共享资源,可以供多个用户共享使用.
以事务为单位管理用户程序的并发访问,提高资源共享效率。数据并发性意味着多个用户可以同时访问数据。
并发访问存在冲突吗?如何控制?
事务:用户定义的一个数据库操作序列.这些操作要么全做要么全不做,是一个不可分割的工作单元.
事务具有ACID 特性:
原子性(atomicity):数据库的逻辑单位,要么都做,要么都不做
一致性(consistency):一致性指的就是当数据库只从某种一致性状态到另一种一致性状态,数据库只包含成功事务提交的结果。
隔离性(Isolation):一个事务执行不受其他事务干扰。
持续性(Durability):一个事务一旦提交,它对数据库中的数据的改变就是永久的。
并发冲突带来的不一致性:
(1)丢失修改:两个事务同时读取同一数据并修改,结果后提交事务提交的修改 覆盖了 前提交事务提交的修改,导致前一个事务的修改丢失;
关键:事务要识别提交修改时刻库中的数据是不是与原读取时刻库中的数据一致.
(2)不可重复读:同一事务前后两次读取的数据不一致
前后两次读取同一数据,数据不一致
前后两次按照同一条件读取数据,所得记录个数不同——-幻读
(3)脏读
读脏数据:一个事务读取了另一个事务未提交的数据.
数据不一致的主要原因是并发操作破坏了事务的隔离性.
两面性:完全隔离事务就成了串行调度事务,系统并发访问的性能很低。我们适当较低事务的隔离性,允许某些不一致,实时采取补救措施。
并发控制:
并发控制中主要技术有:封锁locking、时间戳timestamp、乐观控制法optimistic scheduler、多版本并发控制multi-version concurrency control
单处理机中,事务并行执行 实际上就是 交叉并发执行
封锁协议:
1.一级封锁协议,事物T在修改数据R之前要加上排他锁X,直到事物结束时才释放。
2.二级封锁协议,在一级封锁协议的基础上增加事务T在读取数据R之前要必须先对其增加S锁,读完后即可释放S锁
3.三级封锁协议,在一级封锁协议的基础上增加事务T在读物数据R之之前必须先对其加上S锁,直到事务结束才释放
活锁与死锁
避免活锁的简单方法是 先来先服务(避免饿死的现象)
避免死锁:
1)一次封锁法
2)顺序封锁
事务两段锁协议:
第一阶段获得封锁协议
第二阶段就是释放封锁
事务遵循两段锁是事务可串行化的充分条件,但是不必要;