数据库事务

栏目:云苍穹知识作者:金蝶来源:金蝶云社区发布:2024-09-23浏览:1

数据库事务

# 1 简介 平台系统支持四种事务传递类型: 1. **SUPPORTS** 如果当前存在一个事务,则支持当前事务,如果没有事务则不开启。 2. **REQUIRED** 如果当前存在一个事务,则支持当前事务,如果没有事务则开启。 3. **REQUIRES_NEW** 总是开启一个新的事务。如果一个事务存在,则将当前存在的事务挂起。 4. **NOT_SUPPORTED** 总是非事务地执行,并挂起任何存在的事务。 若当前不存在事务,则默认为NOT_SUPPORTED类型,每个API的调用为独立事务(每次调用自动提交,发生错误自动回滚)。 # 2 应用场景 在需要事务的各个场景都适用。 # 3 接口说明 数据库事务相关接口定义和实现存在于bos-dbengine-1.0.jar中。对于使用者来说只需要调用kd.bos.db.tx.TX类中的方法和kd.bos.db.tx.TXHandle对象的markRollback方法即可。 ## 3.1 接口列表 | 方法 | 说明 | | - | - | | notSupported | 开启NOT_SUPPORTED类型事务 | | required | 开启REQUIRED类型事务 | | requiresNew | 开启REQUIRES_NEW类型事务 | | getPropagation | 获取当前事务类型 | | markRollback | 事务回滚 | ## 3.2 接口详情 ### notSupported + **功能描述** 开启NOT_SUPPORTED类型事务。 + **方法** ```java public static TXHandle notSupported() public static TXHandle notSupported(String tag) ``` + **参数说明** | 参数 | 类型 | 说明 | | - | - | - | | tag | String | 事务标签 | + **返回值** 事务处理对象TXHandle。 + **示例代码** ```java try (TXHandle h = TX.notSupported("fi_voucher_submit")) { try { // 无事务的执行 } } ``` ### required + **功能描述** 开启REQUIRED类型事务。 + **方法** ```java public static TXHandle required() public static TXHandle required(String tag) ``` + **参数说明** | 参数 | 类型 | 说明 | | - | - | - | | tag | String | 事务标签 | + **返回值** 事务处理对象TXHandle。 + **示例代码** ```java try (TXHandle h = TX.required("fi_voucher_submit")) { try { // ... } catch (Throwable e) { h.markRollback(); throw e; } } ``` ***所有SQL异常,在DB里已经标识当前事务为markRollback,在事务结束时执行rollback。但是业务异常,用户应自行设置是否要rollback (markRollback)。*** ### requiresNew + **功能描述** 开启REQUIRES_NEW类型事务。 + **方法** ```java public static TXHandle requiresNew() public static TXHandle requiresNew(String tag) ``` + **参数说明** | 参数 | 类型 | 说明 | | - | - | - | | tag | String | 事务标签 | + **返回值** 事务处理对象TXHandle。 + **示例代码** ```java try (TXHandle h = TX.requiresNew("fi_voucher_submit")) { try { // 在这里执行的,有事务。 } catch (Throwable e) { h.markRollback(); throw e; } } ``` # 4 注意事项 ## 4.1 事务嵌套 事务可嵌套。 ```java try (TXHandle h1 = TX.requiresNew("fi_voucher_submit")) { try { // 在这里执行的,有事务。 try(TXHandle h = TX.notSupported("fi_voucher_submit")) { // 在这里执行的,无事务。 } // 在这里执行的,有事务。 } catch (Throwable e) { h.markRollback(); throw e; } } ``` ***在某个事务内(NOT_SUPPORTED除外)查询出的DataSet,不能在事务外层使用(事务已结束)。*** ## 4.2 禁止跨库写 一个事务里,禁止写两个或以上的物理库,DB检测到则抛异常。 ## 4.3 禁止跨节点事务 跨微服务节点的事务,在API调用时将被检测并抛异常。 ***禁止跨节点事务说明*** + 微服务A调用微服务B,若A中有事务,则B不可有事务。 > 微服务A -> 微服务B: API调用B > 微服务A: A有事务 > 微服务B: B不可有事务 + 微服务A调用微服务B,微服务B再调用微服务C。 > 微服务A -> 微服务B: API调用B > 微服务A: A有事务 > 微服务B: B无事务 > 微服务B -> 微服务C: API调用C > 微服务C: C不可有事务 ***存在跨库写、跨节点事务的场景,请改用MQ实现,把操作流程化。*** # 5 公众号文章 [苍穹平台事务,你知道多少?](https://mp.weixin.qq.com/s/-96KtJnZYdCo6LeFG7ThsA)

数据库事务

# 1 简介平台系统支持四种事务传递类型:1. **SUPPORTS**如果当前存在一个事务,则支持当前事务,如果没有事务则不开启。2. **REQUIRED...
点击下载文档
确认删除?
回到顶部
客服QQ
  • 客服QQ点击这里给我发消息