数据库事务
# 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...
点击下载文档
本文2024-09-23 00:27:57发表“云苍穹知识”栏目。
本文链接:https://wenku.my7c.com/article/kingdee-cangqiong-139636.html
您需要登录后才可以发表评论, 登录登录 或者 注册
最新文档
热门文章