数据库并发
数据库并发定义:
一个处理机处理一个事务,系统允许多个处理机处理多个事务,称为并发
并发引起的影响:
1.修改丢失:事务1和事务2同时操作某条数据,比如机场共有机票16张,事务1卖出一张后修改为15,同时事务2也卖出1张,修改为15,最后数据库中票量为15,实际只剩14个座位
2.不可重复读:事务1第一次读取数据a,假如100,然后事务2修改a为200,事务1第二次读则数据为200
3.脏数据:事务2将a从100改为200,然后事务1读取a,事务2由于修改错误回滚,那么事务1读的数据就是脏数据
处理并发影响的技术--加锁:
排他锁(写锁):事务1对数据a加锁,只有事务1能对a读写,其他的事务不能对a加锁,直到事务1释放锁,称为x锁
共享锁(写锁):s锁,事务1对数据啊加锁,只能对数据进行读操作,其他事务只能对a加s锁,不能加x锁
加锁解决并发的问题:
1.事务1对数据加x锁,等事务释放锁后事务2才能对数据加锁
2.事务1对数据加s锁,直到事务1释放锁后,事务2才能对数据加x锁
3.事务2对数据加x锁,等事务2释放锁后事务1才能加s锁
加锁引起的问题:
活锁:事务1对a加锁,然后事务2请求对a加锁,这时事务3也请求对a加锁,等1释放锁,系统会先处理事务3的请求,这时事务4请求对a加锁,循环这样,事务2请求会一直处理不了
解决:采取先来先处理的方式
死锁:事务1对a加锁,事务2对b加锁,事务1处理过程中请求对b加锁,处理完等待事务2释放锁,而事务2处理过程中对a请求加锁,处理完等待事务1释放,两者都无法释放。
解决:破坏死锁或者允许死锁,定期检查。1.一次性封锁所有数据2.顺序封锁,所有事务按这个顺序封锁
死锁诊断方法有:超时法(可能导致死锁发生无法处理),等待图发(比较负责,需要对系统深入了解)
可串行性:
按某一次序串行的执行事务时的结果一致
事务1:读B;A=B+1;写A
事务2:读A;B=A+1;写B
两段锁
事务分两个阶段对数据项加锁
1.执行前申请加锁
2.执行后不能再申请和获取任何锁
封锁的粒度
封锁对象的大小。
多粒度封锁-多粒度数--数据结构树
意向锁:向数据项的上下节点加锁