假设一个程序中的某个事务更新了 ArcSDE 地理数据库中的数据,但是在事务提交前,另一个程序读取了相同数据。第二个程序将读取未提交的新数据,还是将读取旧数据?答案取决于该事务的隔离级别。
如果该事务允许其他程序读取未提交的数据,第二个程序将读取更新后的数据。这可提高性能,因为第二个程序不必等到事务结束就能读取数据。但存在一个取舍问题:如果第二个程序读取的数据不是最终提交的数据,它读取的可能是不正确或不存在的数据。
为了让用户做出最适合应用的选择,DBMS 提供了用于定义如何将后续进程与其他并发执行进程相隔离的隔离级别。隔离级别可由数据库管理员进行设置并可应用于数据库中的所有事务。也可以在应用程序中或在提交各个事务之前设置。隔离级别指定以下内容:
- 应用程序读取和更新的行对其他并发执行进程的可用程度
- 其他并发执行应用程序进程中的更新对应用程序的可用程度
DBMS 允许设置四个隔离级别中一个,这四个隔离级别从最低到最高在下面列出。每个级别均会增加前一个级别的功能。较高的隔离级别提供较高程度的数据完整性,但以降低并发性为代价,因为锁定的持续时间更长。
未提交读取:这是并发事务中的最低隔离级别。事务可以读取并发事务已更改但尚未提交的数据。
提交后读取:事务只会读取已提交的数据,不会读取未提交的数据。
可重复读取:放置一个附加限制,在事务过程中多次读取相同的行时应用该限制。这可以确保在随后读取相同的行时,它们保持不变。
序列化:该隔离级别是并发事务中隔离度最高的隔离级别。事务中的所有读取操作只能看到事务开始之前提交的数据,而不会看到在事务执行期间提交的并发事务更改。
您的 DBMS 可能会以其他名称来指代这些隔离级别。各个隔离级别在不同 DBMS 中的作用类似,但是仍有一些重要差异。为了避免在应用程序和工作流设计中出现错误,请确保理解了隔离级别如何影响 DBMS 中的锁定和并发。有关详细信息,请参阅 DBMS 文档。
有关隔离级别如何应用于 ArcGIS 以及潜在的并发问题的信息,请参阅并发与锁定。