乐观锁和悲观锁

并发控制机制

    最经常使用的处理多用户并发访问的方法是加锁。当一个用户锁住数据库中的某个对象时,其余用户就不能再访问该对象。加锁对并发访问的影响体如今锁的粒度上。好比,放在一个表上的锁限制对整个表的并发访问;放在数据页上的锁限制了对整个数据页的访问;放在行上的锁只限制对该行的并发访问。可见行锁粒度最小,并发访问最好,页锁粒度最大,表锁介于2者之间。html

悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操做。 悲观锁假定其余用户企图访问或者改变你正在访问、更改的对象的几率是很高的,所以在悲观锁的环境中,在你开始改变此对象以前就将该对象锁住,而且直到你提交了所做的更改以后才释放锁。悲观的缺陷是不管是页锁仍是行锁,加锁的时间可能会很长,这样可能会长时间的限制其余用户的访问,也就是说悲观锁的并发访问性很差。数据库

乐观锁:假设不会发生并发冲突,只在提交操做时检查是否违反数据完整性。乐观锁不能解决脏读的问题。    乐观锁则认为其余用户企图改变你正在更改的对象的几率是很小的,所以乐观锁直到你准备提交所做的更改时才将对象锁住,当你读取以及改变该对象时并不加锁。可见乐观锁加锁的时间要比悲观锁短,乐观锁能够用较大的锁粒度得到较好的并发访问性能。可是若是第二个用户刚好在第一个用户提交更改以前读取了该对象,那么当他完成了本身的更改进行提交时,数据库就会发现该对象已经变化了,这样,第二个用户不得不从新读取该对象并做出更改。这说明在乐观锁环境中,会增长并发用户读取对象的次数。并发

     从数据库厂商的角度看,使用乐观的页锁是比较好的,尤为在影响不少行的批量操做中能够放比较少的锁,从而下降对资源的需求提升数据库的性能。再考虑汇集索引。在数据库中记录是按照汇集索引的物理顺序存放的。若是使用页锁,当两个用户同时访问更改位于同一数据页上的相邻两行时,其中一个用户必须等待另外一个用户释放锁,这会明显地下降系统的性能。interbase和大多数关系数据库同样,采用的是乐观锁,并且读锁是共享的,写锁是排他的。能够在一个读锁上再放置读锁,但不能再放置写锁;你不能在写锁上再放置任何锁。锁是目前解决多用户并发访问的有效手段(Dirty Read 一个事务读到了另一个事务未提交的新数据。)性能

----以上手册中的理论知识;
===========================================================================================
       隔离级别               脏读(Dirty Read)          不可重复读(NonRepeatable Read)     幻读(Phantom Read) 
===========================================================================================spa

未提交读(Read uncommitted)        可能                            可能                       可能htm

已提交读(Read committed)          不可能                          可能                        可能对象

可重复读(Repeatable read)          不可能                          不可能                     可能blog

可串行化(Serializable )                不可能                          不可能                     不可能索引

===========================================================================================事务

·未提交读(Read Uncommitted):容许脏读,也就是可能读取到其余会话中未提交事务修改的数据

·提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

·可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,可是还存在幻象读

·串行读(Serializable):彻底串行化的读,每次读都须要得到表级共享锁,读写相互都会阻塞

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

3.Phantom Read 

一个事务执行了两次查询操做(例如统计具备某特性的数据行数),可是两次查询操做中间,有其余事务插入了新数据或者删除了数据,形成两次结果不一致。

转载:http://www.cnblogs.com/zhoujinyi/p/3437475.html

不可重复读:是指在一个事务内,屡次读同一数据。在这个事务尚未结束时,另一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,因为第二个事务的修改,那么第一个事务两次读到的的数据多是不同的。这样就发生了在一个事务内两次读到的数据是不同的,所以称为是不可重复读。

相关文章
相关标签/搜索