事务及隔离级别管理

事务管理

神通ODBC 中的事务按连接级别进行管理。 在应用程序完成某一事务时,可提交或回滚通过该连接上的所有语句句柄完成的所有工作。 若要提交或回滚事务,应用程序应调用 SQLEndTran ,而不是执行COMMIT 或 ROLLBACK 语句。

应用程序调用 SQLSetConnectAttr 在管理事务的两种 ODBC 模式之间切换:

  • 自动提交模式(默认模式):

    每个语句都在成功完成后自动提交。 当您在自动提交模式中运行时,不要求其他事务管理功能。

  • 手动提交模式

    所有执行语句都包含在同一事务中,直到通过调用 SQLEndTran 专门停止它。

自动提交模式是ODBC 的默认的事务模式。 建立连接后,它将处于自动提交模式,直到 调用 SQLSetConnectAttr 以通过设置自动提交模式来切换到手动提交模式。 在应用程序关闭自动提交后,发送到数据库的下一个语句将开始某一事务。 然后,事务将一直有效,直到应用程序使用 SQL_COMMIT 或 SQL_ROLLBACK 选项调用 SQLEndTran 。

SQLEndTran 发送COMMIT 或 ROLLBACK 后 会自动启动下一个事务。

设置事务模式用例:

SQLSetConnectAttr(hdbc, SQL_AUTOCOMMIT, (SQLPOINTER)SQL_AUTOCOMMIT_OFF, 0);

提交、回滚事务样例:

//提交事务
SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT);
//回滚事务
SQLEndTran( SQL_HANDLE_DBC, hdbc, SQL_COMMIT);

如果应用程序从手动提交模式切换到自动提交模式,则驱动程序将提交在该连接上当前打开的所有事务。

ODBC 应用程序不应直接使用数据库的事务操作语句(例如 BEGIN、COMMIT或 ROLLBACK),因为这可能导致驱动程序中的不确定行为。 ODBC 应用程序应在自动提交模式下运行,并且不应使用任何事务管理功能或语句,或在手动提交模式下运行,并使用 ODBC SQLEndTran 函数提交或回滚事务。

隔离级别管理

神通数据库 ODBC支持所有4种隔离级别,应用程序可以调用SQLSetConnectAttr并设置属性为SQL_ATTR_TXN_ISOLATION选择:

  • Read uncommitted (SQL_TXN_READ_UNCOMMITTED)(以Read committed来支持该级别)
  • Read committed (SQL_TXN_READ_COMMITTED)
  • Repeatable read (SQL_TXN_SERIALIZABLE)(以Serializable来支持该级别)
  • Serializable (SQL_TXN_SERIALIZABLE)

事务隔离级别影响其他用户对结果集的变动在当前游标上的可见性;设置ODBC的事务隔离级别本质是执行数据库的SET TRANSACTION语句来设置数据库的隔离级别。

READ UNCOMMITTED(读未提交)

执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。 当设置该选项时,可以对数据执行未提交读或脏读; 在事务结束前可以更改数据内的数值,元组也可以出现在数据集中或从数据集消失。这是四个隔离级别中限制最小的级别。

READ COMMITTED(读已提交)

指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。该选项是系统的默认值。

REPEATABLE READ(可重复读)

锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。

SERIALIZABLE(串行化)

在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。 这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。