Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 12.0.1 » SQL Anywhere 服务器 - SQL 的用法 » 事务和隔离级别

 

隔离级别和一致性

使用 SQL Anywhere 可以控制一个事务中的操作对其它并发事务中的操作的可见程度。方法是设置名为隔离级别的数据库选项。

SQL Anywhere 还允许您使用相应的表提示控制查询中单个表的隔离级别。

SQL Anywhere 提供以下隔离级别:

此隔离级别…… 具有这些特征……
0—读取未提交数据
  • 允许读取有写锁定或无写锁定的行

  • 未应用读锁定

  • 无法确保并发事务将不会修改行或回退对行所做的更改

  • 对应于表提示 NOLOCK 和 READUNCOMMITTED

  • 允许脏读、非可重复读取和幻像行

1—读取已提交数据
  • 只允许读取没有写锁定的行

  • 仅为读取当前行获取并保持读锁定,但当游标离开该行时释放读锁定

  • 无法确保数据在事务执行过程中不发生更改

  • 对应于表提示 READCOMMITTED

  • 阻止进行脏读

  • 允许非可重复读取和幻像行

2—可重复读取
  • 只允许读取没有写锁定的行

  • 读取结果集中的每一行时获取读锁定,并一直保持到事务结束为止

  • 对应于表提示 REPEATABLEREAD

  • 阻止进行脏读和非可重复读取

  • 允许幻像行

3—可序列化
  • 只允许读取结果中没有写锁定的行

  • 打开游标时获取读锁定,并一直保持到事务结束为止

  • 对应于表提示 HOLDLOCK 和 SERIALIZABLE

  • 阻止脏读、非可重复读取和幻像行

快照1
  • 未应用读锁定

  • 允许读取任何行

  • 事务读取或更新第一行时,将使用已提交数据的数据库快照

语句快照1
  • 未应用读锁定

  • 允许读取任何行

  • 语句读取第一行时,将使用已提交数据的数据库快照

只读语句快照1
  • 未应用读锁定

  • 允许读取任何行

  • 只读语句读取第一行时,将使用已提交数据的数据库快照

  • 对可更新语句使用 updatable_statement_isolation 选项指定的隔离级别(0、1、2 或 3)

1 必须为数据库启用快照隔离,方法是将数据库的 allow_snapshot_isolation 选项设置为 On。

缺省隔离级别为 0,但 Open Client、jConnect 和 TDS 连接除外,它们的缺省隔离级别为 1。

基于锁的隔离级别可以防止部分或全部干扰。级别 3 是最高隔离级别。较低的级别允许的不一致也较多,但通常性能会更高。级别 0(读取未提交数据)为缺省设置。

快照隔离级别可以防止读取和写入操作之间的所有干扰。但写入操作之间仍可能会相互干扰。此级别几乎不会出现不一致的情况,其争用性能与隔离级别 0 相同。由于需要保存和使用行的不同版本,因此与争用无关的性能会变差。

注意

所有隔离级别都确保每个事务或者完全执行,或者根本不执行,并且不会丢失任何更新。

隔离仅在事务之间执行:同一事务中的多个游标不能互相干扰。

 另请参见

快照隔离
典型的不一致类型
设置隔离级别
启用了 ODBC 的应用程序中的隔离级别
查看隔离级别