1.事物的调度分类
并行执行:多个事物是可以同时执行的
串行执行:一个事物在执行的时候另外的事物必须等到当前事物执行完才能执行
串行执行会让运行效率低下,而并行执行会破坏数据库的一致性
2.交叉事物的控制(并行执行事物的控制)
1.2乐观控制(乐观锁)
1.每次访问数据的时候,不加锁,都看做是在做读操作,其他事物也能访问当前事物访问的数据。这样就会造成数据不一致性,所以数据库为了使得数据一致性得到保证,在并发的修改了数据之后,数据库会对相关的数据进行回滚。
2.特点
1.采用的是事后做回滚操作解决冲突问题
2.事物的数据回滚可能造成级联回滚
3.在读操作占大多数的情况下,采用乐观控制效率会高
1.2悲观控制(悲观锁)
1.事物访问数据之前先对数据进行加锁,防止其他事物也访问当前的数据
特点
1.采用的是预防冲突发生的思想
2.采用悲观控制,除非死锁,否则事物肯定会成功
3.其他事物,在某些情况下也可以是读操作
4.悲观控制,就是严格的控制了其他事物对当前事物的访问,有效的避免了大量事物的回滚
2.锁(锁的实质:数据库对元素进行存取的许可证)
2.1锁的分类
1.粒度:库锁,表锁,页锁,行锁 (粒度越大,并发性越差,开销越少;粒度越小,开销越大,并发越好)
2.强度
1.排他锁(独占锁,写锁)
某个事物T占有了元素A的排他锁,其他事物对元素A的任何锁请求都不会被允许,直到事物T释放了锁
事物T可以对A元素做写操作,也可以做读操作
2.共享锁(读锁)
某个事物T占有了元素A的共享锁,那么其他事物对元素A的共享锁请求可以成功,排他锁的请求会失败
事物T只能对元素A做读操作,不能做写操作
3.更新锁
是解决了锁升级带来的死锁问题
一个事物在查询数据的时候对这个元素加“更新锁”,当真正到了修改的时候将“更新锁”升级为“排他锁”,如果查询完成之后,觉得对元素不进行修改,会将锁降级了“共享锁”。
4.意向锁(能够解决加锁冲突)
T1事物对A表某一行加了共享锁,T2事物对A表加了排他锁,T2事物其实也隐含了对每一行的排他锁,这样就会造成加锁冲突
解决加锁层级上问题
分类:意向排他锁;意向共享锁
意向锁,在给表,页加锁的时候并不表明是排他, 还是共享,只有到了真正要执行的行数据的时候才会真正表明是“意向共享锁”或者是“意向排他锁”
2.2锁的相兼容性
1.一个元素可以加多个共享锁
2.一个元素只能加一个排他锁
3.一个元素不能同时加共享锁和排他锁
2.3锁升级/降级
共享锁转成排他锁,锁升级
排他锁转成共享锁,锁降级
2.4两段锁协议
主要解决了:冲突事物的可串行话,简化加锁算法
定义:增长阶段,事物只能加锁,不能释放锁;收缩阶段,事物只能解锁,不能获得锁
2.5加锁导致问题
问题:1.事物阻塞,等待;2.死锁
事物各自持有对方想要的锁,并且都在相互等待对方释放锁
解决方式:1.一次封锁发,事物一次就占据所有字资源,要么全部封锁,要么全不封锁
2.顺序加锁,定义锁的加锁顺序,只能这么来
3.时间戳