SqlServer并发事务(一):事务隔离级别(二)

2015-01-25 19:54:32 · 作者: · 浏览: 10
插入了数据,【事务1】再读取数据。【事务1】两次读取都不一样!幻觉?

?

解决:提高隔离级别

SET TRANSACTIONISOLATIONLEVELSERIALIZABLE

?

此时【事务2】等待【事务1】完成。

事务1的运行结果2次都一样:

id name info

1 kk NULL


范围锁:范围锁处于与事务中执行的每个语句的搜索条件相匹配的键值范围之内。这样可以阻止其他事务更新或插入任何行,从而限定当前事务所执行的任何语句。这意味着如果再次执行事务中的任何语句,则这些语句便会读取同一组行。在事务完成之前将一直保持范围锁。这是限制最多的隔离级别,因为它锁定了键的整个范围,并在事务完成之前一直保持范围锁。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有SELECT语句中的所有表上设置HOLDLOCK相同。

?

?

如果在批处理中设置 REPEATABLE READ,并且该批处理调用一个将隔离级别设置为SERIALIZABLE的存储过程,则当该存储过程将控制返回给该批处理时,隔离级别就会恢复为REPEATABLEREAD。

?

并发事务引起的问题

问题

描述

结果

解决

丢失更新

A读—B读—A改—B改

A更改丢失

READ UNCOMMITTED

脏读

A改—B读—A回滚

B读无效值

READ COMMITTED

不可重读

A读—B改—A读

A读不一致

REPEATABLE READ

不可重读

A读—B改—A读

A读不一致

SNAPSHOT

幻读

A读—B增删—A读

A读或多或少

SERIALIZABLE


?