Inside SqlServer 读书随笔:并发和事务

并发和事务

      并发可以理解为多个进程同时访问和修改同一数据(或共享数据)的能力和行为。

      数据库系统一般采用两种方式来管理并发:悲观并发控制和乐观并发控制。SqlServer2005之前的版本只支持悲观并发控制。

      两者的区别在于是在并发冲突发生之前进行预防还是在并发冲突发生后进行处理。

悲观并发控制

       是假定系统中存在足够多的数据修改操作,它们会对每一个确定要执行的读取操作产生影响。系统的悲观想法会造成:无论读取或者修改数据,都占有此数据上的锁来阻止其它进程对此数据的修改或读取。也就说,读、写会相互阻塞。

乐观并发控制:

      是假定系统存在非常少的会造成冲突的数据修改操作,以致于任何单独的事务几乎不会修改其它事务正在使用的数据。乐观并发控制采用行版本控制来保存发生修改前数据行的一个副本,如果这时候有读取操作发生则会读取副本数据,两者之间不会冲突。但是两个修改操作之间还会冲突,也就说,会有写--写阻塞。

 

任何事务都具有ACID属性。

A(原子性):任何事务要么提交,则所有操作结果被保留;要么中止,则所有操作结果被撤消。不存在第三种情况。

 

C(一致性):数据总是要保持逻辑正确性,所有规则和约束必需被执行。

 

I(隔离性):并发事务会与其它未完成事务的更新操作相隔离。如果不隔离就会产生错误的结果。假设要把10更新成20,当操作正在进行时,

                 突然并发一个查询“更新后的数据”的操作,之后更新操作被中止了,那之前并发的那个查询结果就成了一个实际上不存在数据。

 

D(持久性):当事务提交成功,持久性就保证事务的作用会一直存在。不会因为停电,系统崩溃等等而丢失。

 

事务还会表现出一些可能的行为:

   丢失更新:当两个进程读取相同数据并修改它们,然后更新,这时第二个进程可能会完全覆盖掉第一个进程所做的更新。

 

   脏   读:当一个进程修改了某个数据,并未提交时,另一个进程读取到了这个修改后的数据(这种读取就叫脏读),之后第一个进程的事务被撤消,

               修改并未生效。那第二个进程读的数据就是逻辑上不存的数据。这会造成不一致状态的发生。

 

  不可重复读:一个事务需要分两次读取同一个数据,但是在两次读取的间隔时间内某个进程修改了这个数据,造成两读取同一个数据却得到不同的值。

 

      幻  读: 这个发生在一个事务中两次执行同一个带有谓词的查询时。比如查询字段A值小于10的所有行(where A<10),

                  第一次查询得到10行,接着插入了一个新行并且字段A的值小10,那么第二次查询时就会得到11行,造成两次结果不一样。

posted @ 2011-11-03 16:18  Joe.TJ  阅读(552)  评论(0编辑  收藏  举报