串行等价性,满足串行等价性的事务,可以让CPU在不同事务间切换,轮有执行。这样的当事务中含有需要长时间访问磁盘的操作时,就可以执行其他事务,提供资源利用率。同时对于短事务可以降低响应时间。
事务的串行等价性,指事务所含指令交叉执行的结果与串行一个一个执行结果似乎一样的。
事务具有串行等价的充分必要条件,如果不同事务访问的资源有重叠,含有冲突操作时,那么不同事务访问资源的顺序必须一样。
比如: 事务A,先访问i,再访问j资源;而事务B,先访问j,再访问i资源。访问还是冲突的(如读写冲突、写写冲突),那事务A与事务B将不满足串行等价。这样就无法实现CPU在不同事务间来回切换执行。
对于不满足串行等价的事物,服务器可以通过串行化对象访问来达到事物的串行等价。
这就好比两个线程访问资源是冲突的,那么我就加锁强制两个线程串行的访问资源。
不同人编写的事务不同,访问的资源不同,CPU如何在这些事务的指令上切换也是随意的,那么怎么能保证这些事务执行的结果是对的呢。
简单的做法是加互斥锁,一个对象一把锁,一个时刻只有一个人可以访问、修改该对象,同时直到事务中所有的操作执行完了才一并释放锁。这就是两阶段加锁。
加锁必然降低并发,那么就通过修改锁,提出了读锁、写锁分离、层次锁等概念来减低锁的粒度、锁强度从而增强并发。比如一个队列,在队列头部插入,在队列结尾删除。如果只有一把锁,那么插入和删除就不能并发执行。如果有两把锁将插入和删除区分开,则会减少冲突,提高并发。
有加锁必然就有死锁的情况出现。那么死锁与什么有关? 串行等价性到底有什么作用?
1. 串行等价性让计算资源可以充分利用,不用一个事务接一个事务的执行。
2. 但运行调度和切换执行事务操作后如何保证事务的正确性,特别是当不同事务访问相同资源时,常用方法就是加锁。
3. 加锁就有死锁情况出现,死锁与加锁、解锁的调用方式有关。比如同时等待多个锁,同时释放多个锁;还是对一个对象加锁、释放,然后再一个对象加锁、释放;这些方式的不同就会引发死锁。
此文章由 http://www.ositren.com 收集整理 ,地址为:
http://www.ositren.com/htmls/67275.html