事务(Transaction0):要么全做,要么全不做;
事务ACID:原子性Atomicity;一致性Consistency;隔离性Isolation;持久性Durability;
并发操作问题:
1.丢失更新;(同时提交数据时,t2的事务会并发导致t1的事务修改被丢失)
2.不可重复读;(事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了)
3.读 ' 脏 ' 数据;(并发情况下,事务2读取到事务1修改到一半就回退的数据,读取的数据有误)
封锁是最常用的并发控制技术:
基本思想为:需要时,事务通过向系统请求对它所希望的数据对象(数据库中的记录)加锁,以确保它不会被非预期改变;
锁的概念:实质上就是一个允许或阻止一个事务对一个数据对象的存取特权;
1.基本的封锁类型有两种:排他锁(Exclusive Lock,X锁)和共享锁(SharedLock,S锁)
2.用封锁对进行并发控制:
2.1 若事务T对数据D加了X锁,则所有别的事务对数据D的锁请求都必须等待直到事务T释放锁;
2.2 若事务T对数据D加了S锁,则别的事务还可对数据D请求S锁,而对数据D的X锁请求必须等待直到释放锁;
2.3 事务执行数据库操作时都要先请求相应的锁,即对读请求S锁,对更新(插入、删除、修改)请求X锁;
2.4 事务一直占有获得的锁直到结束(COMMIT或ROLLBACK)时释放;
3.封锁的粒度:
通常以粒度来描述封锁的数据单元的大小;DBMS(数据库管理系统)可以决定不同粒度的锁;有最底层的数据元素到最高层的整个数据库,粒度越细,并发性越大,但软件复杂性和系统开销也就越大;
4.封锁的级别:
4.1 0级封锁:封锁的事务不重写其它非0级封锁事务的未提交的更新数据。这种状态实际上实用价值不大;
4.2 1级封锁:被封锁的事务不允许重写未提交的更新数据,这防止丢失更新的发生;
4.3 2级封锁:被封锁的事务既不重写也不读未提交的更新数据,这除了1级封锁的效果外还防止了读脏数据;
4.4 3级封锁:被封锁的事务不读未提交的更新数据,不写任何(包含读操作的)未提交的数据;
4.5 活锁与死锁:
4.5.1 封锁带来的一个重要问题是困难引起“活锁”与“死锁”;
4.5.2 锁:级别低的事务无法执行;可采用先来先服务的策略解决;
4.5.3 死锁:两个以上事务循环等待被同组中另一事务锁住的数据单元的情形,称为“死锁”;
- 如何解决: 1. 一次性锁请求; 2. 锁请求排序; 3. 序列化处理;4. 资源剥夺; - 对待死锁的另一种方法是不去防止,而让其发生并随时进行监测,一旦监测到系统已发生了死锁再进行解除处理;
6. 可串行性:一组事务是一个调度就是它们的基本操作的一种排序;通常,在数据库系统中,*可串行性是并发执行的正确性准则,即当且仅当一组事务的并发执行调度是可串行化的,才认为它们是正确的;
7. 两段封锁法: 1. 事务划分成两个阶段:1.发展(Growing)或加锁阶段;2.收缩(Shrinking)或释放锁阶段;