1.目前只支持手动控制嵌套事务
2.事务控制由上下文BaseContextHandler中的mata控制
(1) //获取meta
Meta meta = BaseContextHandler.getMeta();
(2) //新建一个事务点,oracle事务点名称规则有限制可以使用String point1 = "SP"+IdGenerator.nextId();
String point1 = UUID.randomUUID().toString();
(3) //子事务的回滚或者提交,如不主动提交则跟随后续meta.commit一起提交
try {
//在设置savepoint之前将事务提交模式设置成手动提交
meta.getRelationDBAccessor().setAutoCommit(false);
//设置事务点
meta.setSavepoint(point1);
validates(v);
//执行成功,直接commit(会提交整个point及之前的代码事务)
meta.commit();
}catch (Exception e){
//失败,可以回滚当前事务点的代码
meta.rollback(point1);
}
(4)可运行demo:
public RecordSet create(List<Map<String, Object>> valuesList) throws SQLException {
//获取meta
Meta meta = BaseContextHandler.getMeta();
List<Map<String, Object>> v = new ArrayList<>();
Map<String,Object> m = valuesList.get(0);
m.remove("upload_field_images");
v.add(m);
RecordSet rs = (RecordSet) this.getMeta().get("TestUser").callSuper(TestUser.class,"create",v);
//新建一个事务点,oracle事务点名称规则有限制可以使用String point1 = "SP"+IdGenerator.nextId();
String point1 = UUID.randomUUID().toString();
try {
meta.getRelationDBAccessor().setAutoCommit(false);
meta.setSavepoint(point1);
validates(v);
//执行成功,直接commit(会提交整个point及之前的代码事务)
meta.commit();
}catch (Exception e){
//失败,可以回滚当前事务点的代码,不影响其他代码事务执行
meta.rollback(point1);
}
//commit事务后,后续操作会开启新事务
meta.commit();
if(StringUtils.isBlank((String) valuesList.get(0).get("phone"))){
throw new RuntimeException("手机号码不能为空。。。。");
}
rs = (RecordSet) this.getMeta().get("TestUser").callSuper(TestUser.class,"create",v);
return rs;
}
public void validates(List<Map<String, Object>> valuesList){
if(StringUtils.isBlank((String) valuesList.get(0).get("phone"))){
throw new RuntimeException("手机号码不能为空。。。。");
}
this.getMeta().get("TestUser").callSuper(TestUser.class,"create",valuesList);
}