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

SQL Anywhere 12.0.0 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 使用事务和隔离级别

 

小结

在数据库中,事务和锁定是重要性仅次于表之间关系的两个方面。使用锁定时一定要谨慎,并且在构建事务时也一定要仔细,这一点对任何数据库的完整性和性能都有好处。如果要创建的数据库必须并发执行大量命令,这两者都非常重要。

事务可以将 SQL 语句组合成逻辑工作单元。要完成事务,可以回退所有更改,或者提交更改使其成为永久更改。

出现系统故障时,事务对数据恢复非常重要。它们在交错执行并发事务的语句中也扮演着关键角色。

要提高性能,必须并发执行多个事务。每个事务都由 SQL 语句组成。如果并发执行两个或多个事务,数据库服务器必须调度各个语句的执行。与依次执行的事务不同,并发事务会造成不一致。

隔离级别采用四种不一致类型来定义:

  • 脏读   一个事务读取了由另一个事务修改但尚未提交的数据。

  • 非可重复的读取   一个事务读取相同的行两次,但得到的值却不同。

  • 幻像行   一个事务使用特定的条件执行了两次选择行的操作,但在第二次的结果集中发现了新行。

  • 更新丢失   由于允许一个事务基于以前的数据保存更新,导致另一个事务对一行的更改完全丢失。

如果按调度执行语句时数据库达到的状态与依次执行各个事务时相同,那么这个调度就叫做可序列化调度。我们认为,可序列化调度是正确的。可序列化调度不会造成以上任何一种不一致。

通过锁定,可以控制允许的干扰程度和类型。SQL Anywhere 提供了四个锁定级别:隔离级别 0、1、2 和 3。使用最高级别(级别 3)时,SQL Anywhere 可确保调度是可序列化的,也就是说,执行所有事务的结果与依次运行这些事务相同。

可惜的是,一个事务获取的锁定可能会阻碍其它事务的进度。由于这个问题,只要较低隔离级别可能会引起的不一致是可以忍受的,就应使用较低的级别。通过较高的隔离级别来提高数据一致性常常意味着并发性会降低,也就是说,数据库处理并发事务的效率会降低。常常需要在一致性与性能之间找到平衡点,从而确定适合各个操作的隔离级别。

如果不同事务的锁定要求之间发生冲突,可能会导致阻塞或死锁。SQL Anywhere 具有用于处理这两种情况的机制,并为您提供了用于控制它们的选项。

但是,使用较高隔离级别的事务也不总是 会影响并发性。只有在其它事务需要访问锁定行时才会受到阻碍。可以通过仔细设计数据库和事务来提高并发性。例如,可以通过把一个事务分割成两个较短的事务来缩短持有锁定的时间,或者,您可能会发现添加索引可以让事务以较高的隔离级别运行,而放置的锁定反而会减少。