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

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用事务和隔离级别

 

使用事务

SQL Anywhere 期望您将命令组合到事务中。您提交事务以使对数据库进行的更改成为永久更改。更改数据时,所做的更改会记录在事务日志中,直到输入 COMMIT 命令后才成为永久更改。

事务起始于以下事件之一:

  • 在与数据库连接后执行的第一个语句。

  • 在事务结束后执行的第一个语句。

以下事件之一将完成事务:

  • 执行 COMMIT 语句使对数据库进行的更改成为永久更改。

  • 执行 ROLLBACK 语句撤消由事务执行的所有更改。

  • 执行具有自动提交副作用的语句:数据定义命令(如 ALTER、CREATE、COMMENT 和 DROP)都具有自动提交副作用。

  • 与数据库断开连接将执行隐式回退。

  • ODBC 和 JDBC 具有一个自动提交设置,可以在每个语句后强制执行 COMMIT 命令。缺省情况下,ODBC 和 JDBC 要求将自动提交设置为 ON,并且要求每个语句都是一个事务。如果要利用事务设计的各种可能性,则应关闭自动提交设置。

    有关自动提交的详细信息,请参见设置自动提交或手工提交模式

  • 将 chained 数据库选项设置为 Off 与在每个语句后强制自动提交类似。缺省情况下,那些使用 jConnect 或 Open Client 应用程序的连接已将 chained 设置为 Off。

    有关详细信息,请参见设置自动提交或手工提交模式chained 选项 [兼容性]

Interactive SQL 中的选项

Interactive SQL 提供两个选项,可用来控制事务结束的时间和方式:

  • 如果您将 auto_commit 选项设置为 On,则 Interactive SQL 将自动在成功执行每一语句后提交您的结果,并且自动在每一失败的语句后执行 ROLLBACK。请参见auto_commit 选项 [Interactive SQL]

  • commit_on_exit 选项的设置控制退出 Interactive SQL 时对未提交的更改执行的操作。如果该选项设置为 On(缺省设置),则 Interactive SQL 执行 COMMIT 语句;否则,它会用 ROLLBACK 语句撤消未提交的更改。请参见commit_on_exit 选项 [Interactive SQL]

在 Interactive SQL 中使用数据源

缺省情况下,ODBC 在自动提交模式下工作。即使已在 Interactive SQL 中将 auto_commit 选项设置为 Off,ODBC 的设置也将替换 Interactive SQL 的设置。可以使用 SQL_ATTR_AUTOCOMMIT 连接属性更改 ODBC 的设置。ODBC 自动提交与 chained 选项无关。

SQL Anywhere 也支持 Transact-SQL 命令(例如 BEGIN TRANSACTION),以便和 Sybase Adaptive Server Enterprise 兼容。有关详细信息,请参见Transact-SQL 兼容性

确定事务的开始时间

TransactionStartTime 数据库属性返回数据库在 COMMIT 或 ROLLBACK 操作后第一次修改的时间。可以使用此属性查找所有活动连接的最早事务的开始时间。例如:

BEGIN
  DECLARE connid int;
  DECLARE earliest char(50);
  DECLARE connstart char(50);
  SET connid=next_connection(null);
  SET earliest = NULL;
  lp: LOOP
  IF connid IS NULL THEN LEAVE lp END IF;
    SET connstart = CONNECTION_PROPERTY('TransactionStartTime',connid);
    IF connstart <> '' THEN
      IF earliest IS NULL 
      OR CAST(connstart AS TIMESTAMP) < CAST(earliest AS TIMESTAMP) THEN
        SET earliest = connstart;
      END IF;
    END IF;
    SET connid=next_connection(connid);
  END LOOP;
  SELECT earliest
END