隔离级别

锁定在用作事务控制机制时,可以解决并发问题。 虽然可以在任何时间运行多个事务,但锁定只允许所有事务独立运行,运行时相互完全隔离。 在隔离级别,事务可以接受不一致的数据。 提高隔离级别可以更有效地防止数据的不一致性,但缺点是降低并发处理能力。

在 SQL Server Compact 3.5 中,应用程序需要的隔离级别决定了 SQL Server Compact 3.5 所使用的锁定行为。

SQL Server Compact 3.5 支持下列隔离级别(从最低到最高):

  • 已提交读(SQL Server Compact 3.5 默认设置)
  • 可重复读
  • 可串行读(事务之间相互完全隔离)

随着隔离级别的提高,可以更有效地防止数据的不一致性。 但是,这将降低事务的并发处理能力,会影响多用户访问。

备注

SQL Server Compact 3.5 可以确保一个事务无法读取另一个事务的未提交数据(脏读)。 实现此功能的方法是,通过使用页版本控制机制,允许用户读取数据,而不需要数据的 S 锁。 这样,对于读 (SELECT) 操作,可以允许例外的并发处理。

隔离级别与并发问题

下表列出了隔离的级别以及各个级别可以解决的并发问题:

备注

可能出现的并发问题包括未提交相关性、不一致分析以及幻读。 有关并发问题的详细信息,请参阅并发

隔离级别 未提交相关性(脏读) 不一致分析(不可重复读) 幻读

已提交读

可重复读

可串行读

隔离级别可以通过编程方式进行设置,也可以通过使用 SQL 语法 SET TRANSACTION ISOLATION LEVEL 进行设置。 有关详细信息,请参阅事务隔离级别

事务范围内的隔离级别

System.Transaction 的默认隔离级别为 Readcommitted。 不过,在默认情况下,执行事务范围内的事务时,其隔离级别设置为 Serializable。 因此,在将 SQL Server Compact 3.5 连接登记到事务范围时,隐式事务(为事务范围内部创建的 SQL Server Compact 3.5 事务)在默认情况下按照 Serializable 隔离级别运行。 某些 TransactionScope 类的重载的构造函数将接受隔离级别作为参数。 这些构造函数应用于为隐式事务指定不同的隔离级别值。 如果 SQL Server Compact 3.5 不支持指定的隔离级别,则将 SQL Server Compact 3.5 连接登记到事务范围将引发异常。

同样,作为连接字符串的一部分指定的属性 default lock timeout 将控制事务等待的时间。 但是,在将一个连接登记到 TransactionScope 时,TransactionScopeTimeSpan 将重写此属性。 例如,如果 ConnectionString 包含 1000 毫秒作为 default lock timeout 的值,且在一个为期 100 毫秒的 TransactionScope 中登记了连接,则环境事务将仅持续 100 毫秒,而不是持续 1000 毫秒。这意味着如果您希望应用程序具有更长的事务超时并运行 TransactionScope 中的命令,则必须在连接字符串和 TransactionScopeTimeSpan 中指定超时值。

备注

default lock timeout 的默认值为 2000 毫秒,而 TransactionScope 的默认值为 1 分钟。

另请参见

概念

事务 (SQL Server Compact)
锁定 (SQL Server Compact)
游标 (SQL Server Compact)

帮助和信息

获取帮助 (SQL Server Compact 3.5 Service Pack 1)