使用逻辑工作单元
逻辑工作单元功能可将多个数据库事务动作分组到一个逻辑工作单元中,或通过回滚操作将更改提交至数据库或丢弃更改。数据库事务动作可通过 Logical Unit of Work Begin(逻辑工作单元开始)动作获得的逻辑工作单元标识符 (LUWId) 链接在一起。Logical Unit of Work Commit(逻辑工作单元提交)和 Logical Unit of Work Rollback(逻辑工作单元回滚)动作用于结束逻辑工作单元。
假设
假设下述条件成立:
- 熟悉事务概念以及使用 SQL Begin(SQL 启动)、Commit(提交)和 Rollback(回滚)操作划分逻辑工作单元。
- 熟悉数据库锁定功能和访问并发表。
流程
本节介绍了为使用逻辑工作单元功能而需要执行的任务。
- 创建数据库传输,并指定 Logical Unit of Work(逻辑工作单元)参数值,例如打开超时、事务计数限值和默认解决方案(Commit(提交)或 Rollback(回滚))。参见创建数据库传输。
- 创建数据库传输并使用逻辑工作单元功能时,需要指定大于 1 的 Connection Pool Size(连接池大小)。当执行 Logical Unit of Work Begin(逻辑工作单元开始)动作时,事务服务器将保留离开池的连接以处理与此逻辑工作单元关联的事务。为处理逻辑工作单元之外的数据库事务,事务服务器不允许保留最后一个可用连接。
- 创建触发器并使用 Logical Unit of Work Begin(逻辑工作单元开始)动作以指示您要启动逻辑工作单元。如果该动作成功,则输出参数中将包含 36 个字符的全局唯一标识符 (GUID)。即逻辑工作单元标识符 (LUWId)。
- 为了指示需要在逻辑工作单元内执行的数据库事务动作,将标识符映射到数据库事务动作的 LUWId 输入参数。此 LUWId 可以在触发器和子触发器之间共享。
- 使用 Logical Unit of Work Commit(逻辑工作单元提交)动作指示您要提交的 SQL 操作,该操作通过与 LUWId 相关联的数据库事务动作执行。
- 使用 Logical Unit of Work Rollback(逻辑工作单元回滚)动作指示您要回滚的 SQL 操作,该操作通过与 LUWId 相关联的数据库事务动作执行。
下面显示了部分触发器以及使用逻辑工作单元功能的动作:
MySQL
如果通过 MySQL 使用逻辑工作单元功能,则与数据库事务动作相关联的表需要使用 InnoDB 存储引擎。默认选择的 myISAM 存储引擎不支持事务。这意味着对 myISAM 表所做的任何更改都将立即提交,并且无法回滚。如需了解更多信息,请参阅 MySQL 服务器数据库文档。
LOCALDB
逻辑工作单元功能无法与 LOCALDB 传输一起使用,包括 LOCALDB 至 LOCALDB5。
数据库级别锁定
还存在其他数据库级别锁定问题,将按数据库类型枚举如下:
记录锁定
事务服务器使用 JDBC 访问支持的数据库。由数据库传输处理程序执行的所有数据库操作均以 TRANSACTION_READ_COMMITTED 隔离级别执行,但是带有 Pessimistic Locking(悲观锁定)的 Select With Update(选择并更新)传输映射除外,其中隔离级别升级为 TRANSACTION_SERIALIZABLE。在逻辑工作单元内访问表时,数据库服务器可选择锁定各个行、关联的索引文件或整个表。影响在于使用相同表的其他传输映射可能会遇到等待当前逻辑工作单元关闭(提交和回滚)时超时。JDBC 驱动程序和数据库服务器以不同方式解释和实现声明的隔离级别,并且还使用多种锁定升级技术。这可能导致访问锁定表的其他事务失败。本文档不涉及这些应用场景的详细描述。与您的数据库管理员合作,以更好地了解逻辑工作单元事务对表锁定的影响。
MySQL
将数据从多个逻辑工作单元插入以主键或唯一索引定义的表中时,一个或多个逻辑工作单元事务动作在其他逻辑工作单元处于打开状态时仍会遇到锁定等待条件。这是由于 MySQL 使用了 InnoDB Record、Gap 和 Nex-Key 锁。因此,当索引范围被另一个逻辑工作单元锁定时,尝试插入具有处于该范围内的主键列值的行时,将导致等待索引范围锁的事务被释放。如果指定的主键值不在锁定范围内,则 Insert(插入)操作不会中断。即使逻辑工作单元以隔离级别 TRANSACTION_READ_COMMITTED 运行,也会发生这种情况。有关详细说明,请参阅 MySQL Server 数据库文档。
在逻辑工作单元内使用 Select with Update(选择并更新)或 Select with Delete(选择并删除)操作时,基础表应定义主键,否则事务会失败。这是 JDBC 规范所施加的限制。请参阅有关“结果集增强”和“可更新结果集”的 JDBC 规范部分。
超时注意事项
在数据库传输定义中配置超时值时,请使用长于数据库服务器所指定的锁定超时的值。如果事务超时低于此值,并且由于逻辑工作单元而导致锁定等待条件处于处理中,则传输将超时并关闭与数据库的连接,从而使当前打开的逻辑工作单元无效。当事务超时长于配置的数据库锁定超时时,传输处理程序将向数据库事务动作反馈失败;但是,与数据库的连接仍将保持已建立状态,并且可以使用当前打开的逻辑工作单元。
可以使用数据库传输上的 Extended Attributes(扩展静态属性)功能在以下数据库上配置锁定超时值。参见创建数据库传输。
数据库 | 扩展静态属性 |
---|---|
DB2 | 指定的 currentLockTimeout,以秒为单位。 |
SQL Server | 指定的 lockTimeout,以毫秒为单位。 |
异常条件
- 数据库传输处理程序处于存储和转发模式下。
- 数据库传输处理程序无法连接到目标数据库。
在以下条件下,所有打开的 LUWId 均将变得无效:
- 数据库传输处理程序丢失与数据库服务器的连接。
- 由于引起传输转至存储和转发的非逻辑工作单元数据库事务动作失败,导致数据库传输处理程序过渡到存储和转发。
发生这种情况时,在数据库事务动作或者提交或回滚动作中使用 LUWId 将导致动作失败。
- 逻辑工作单元内执行的事务数超过传输定义中规定的 Transaction Count Threshold(事务计数阈值)。
- 逻辑工作单元处于打开状态的时间段超过传输定义中规定的 Idle Timeout(空闲超时)。
发生这种情况时,将记录一条异常消息。
有关打开逻辑工作单元的系统变量信息
事务服务器将在 System Variables(系统变量)表中发布逻辑工作单元信息。可使用 Workbench(工作台)> Administration(帐户管理)> System Variables(系统变量)选项卡查看这些变量。
系统变量 | 描述 |
---|---|
trans.luw.count | 此项为所有传输的所有活动逻辑工作单元的计数。 |
trans.luw.[0..30] |
每个逻辑工作单元在系统变量表中都有一个条目。此条目显示传输名称和逻辑工作单元标识符,以及等待执行的请求数(请求等待)和已执行的事务数(已执行)。系统变量将不显示超过 31 个并发活动逻辑工作单元的信息。 |