事务隔离机制

    数据库并发操作存在的异常情况:

  1. 更新丢失(Lost update):两个事务更新一行数据,但是第二事务却中途失败退出,导致对数据两个修改都失效了,这是系统没有执行任何锁操作,因此并发事务并没有被隔离开来
  2. 脏读取(Dirty Reads):一个事物开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险,很可能所有操作都被回滚
  3. 不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次,但是却得到了不同结果。例如在两次读取中途,有另外一个事务对该行数据进行了修改并提交
  4. 两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据,然后其中一个对它进行修改提交,而另一个也进行了修改提交,这就会造成第一次写操作失效
  5. 幻读(Plantom Reads):事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据,这是因为在两次查询过程中有另外一个事务插入数据造成的。

    为了避免上面的几种情况,在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同:

  1. Read Uncommitted(未提交读):允许脏读取,但不允许更新丢失,如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。此隔离级别可以通过“排他写锁”实现。事务隔离级别最低,仅可保证不读取物理损坏的数据。与Read Committed隔离级相反,它允许读取已经被其他用户修改但尚未提交确定的数据
  2. Read Committed(提交读):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server默认的级别。在此隔离级下,Select命令不会返回尚未提交的数据,也不能返回脏数据
  3. Repeatable Read(可重复读取):禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可能通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。在此隔离级别下,用Select命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级别
  4. Serializable(可串行读):提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。

隔离级别     更新丢失     脏读取     重复读取     幻读

未提交读        N                   Y               Y                Y

提交读            N                   N              Y                Y

可重复读        N                   N              N                Y

串行                N                   N              N                N

你可能感兴趣的:(sql,SQL Server)