千家信息网

Spring中事务的传播属性总结

发表于:2025-01-24 作者:千家信息网编辑
千家信息网最后更新 2025年01月24日,本篇内容主要讲解"Spring中事务的传播属性总结",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Spring中事务的传播属性总结"吧!我们用Spring时
千家信息网最后更新 2025年01月24日Spring中事务的传播属性总结

本篇内容主要讲解"Spring中事务的传播属性总结",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Spring中事务的传播属性总结"吧!

我们用Spring时,很多时候都会用到他的声明式事务,简单的在配置文件中进行一些规则配置,利用Spring的AOP功能就能轻松搞定事务问题;这里面就涉及到一个事务的传播属性问题【Propagation】,它在TransactionDefinition接口中定义,有兴趣可以看看src,共有7种选项可用:

PROPAGATION_REQUIRED:支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
PROPAGATION_SUPPORTS:支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY:支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED:支持当前事务,新增Savepoint点,与当前事务同步提交或回滚。
现在结合一个实例,应用以上各种传播属性来进行说明:首先声明两个bean:ServiceA和ServiceB,其中ServiceB被引用;

view plaincopy to clipboardprint?
ServiceA {

void methodA() {

ServiceB.methodB();

}

}


ServiceB {

void methodB() {

// ...

}

}
view plaincopy to clipboardprint?
ServiceA {

void methodA() {

ServiceB.methodB();

}

}


ServiceB {

void methodB() {

// ...

}

}

ServiceA {

void methodA() {

ServiceB.methodB();

}

}


ServiceB {

void methodB() {

// ...

}

} 接下来,我们就一一分析下:

PROPAGATION_REQUIRED
加入当前正要执行的事务不在另外一个事务里,那么就起一个新的事务;比如说,ServiceB.methodB的事务级别定义为PROPAGATION_REQUIRED, 那么由于执行ServiceA.methodA的时候, ServiceA.methodA已经起了事务,这时调用ServiceB.methodB,ServiceB.methodB看到自己已经运行在ServiceA.methodA 的事务内部,就不再起新的事务。而假如ServiceA.methodA运行的时候发现自己没有在事务中,他就会为自己分配一个事务。 这样,在ServiceA.methodA或者在ServiceB.methodB内的任何地方出现异常,事务都会被回滚。即使ServiceB.methodB的事务已经被 提交,但是ServiceA.methodA在接下来fail要回滚,ServiceB.methodB也要回滚。
PROPAGATION_SUPPORTS
如果当前在事务中,即以事务的形式运行,如果当前不再一个事务中,那么就以非事务的形式运行。
PROPAGATION_MANDATORY
必须在一个事务中运行。也就是说,他只能被一个父事务调用。否则,他就要抛出异常。
PROPAGATION_REQUIRES_NEW
比如我们设计ServiceA.methodA的事务级别为PROPAGATION_REQUIRED,ServiceB.methodB的事务级别为PROPAGATION_REQUIRES_NEW, 那么当执行到ServiceB.methodB的时候,ServiceA.methodA所在的事务就会挂起,ServiceB.methodB会起一个新的事务,等待ServiceB.methodB的事务完成以后, 他才继续执行。他与PROPAGATION_REQUIRED 的事务区别在于事务的回滚程度了。因为ServiceB.methodB是新起一个事务,那么就是存在 两个不同的事务。如果ServiceB.methodB已经提交,那么ServiceA.methodA失败回滚,ServiceB.methodB是不会回滚的。如果ServiceB.methodB失败回滚, 如果他抛出的异常被ServiceA.methodA捕获,ServiceA.methodA事务仍然可能提交。
PROPAGATION_NOT_SUPPORTED
当前不支持事务。比如ServiceA.methodA的事务级别是PROPAGATION_REQUIRED ,而ServiceB.methodB的事务级别是PROPAGATION_NOT_SUPPORTED, 那么当执行到ServiceB.methodB时,ServiceA.methodA的事务挂起,而他以非事务的状态运行完,再继续ServiceA.methodA的事务。
PROPAGATION_NEVER
不能在事务中运行。假设ServiceA.methodA的事务级别是PROPAGATION_REQUIRED, 而ServiceB.methodB的事务级别是PROPAGATION_NEVER, 那么ServiceB.methodB就要抛出异常了。
PROPAGATION_NESTED
理解Nested的关键是savepoint。他与PROPAGATION_REQUIRES_NEW的区别是,PROPAGATION_REQUIRES_NEW另起一个事务,将会与他的父事务相互独立, 而Nested的事务和他的父事务是相依的,他的提交是要等和他的父事务一块提交的。也就是说,如果父事务最后回滚,他也要回滚的。 而Nested事务的好处也是他有一个savepoint:
view plaincopy to clipboardprint?
ServiceA {

void methodA() {

try {

ServiceB.methodB();

} catch (Exception e) {

// 执行其他业务

ServiceC.methodC();

}

}

}
view plaincopy to clipboardprint?
ServiceA {

void methodA() {

try {

ServiceB.methodB();

} catch (Exception e) {

// 执行其他业务

ServiceC.methodC();

}

}

}

ServiceA {

void methodA() {

try {

ServiceB.methodB();

} catch (Exception e) {

// 执行其他业务

ServiceC.methodC();

}

}

}也就是说ServiceB.methodB失败回滚,那么ServiceA.methodA会回滚到savepoint点上,ServiceA.methodA可以选择另外一个分支,比如 ServiceC.methodC,继续执行,来尝试完成自己的事务;但是这个事务并没有在EJB标准中定义。

到此,相信大家对"Spring中事务的传播属性总结"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

事务 级别 运行 属性 传播 支持 时候 业务 也就是 也就是说 方式 接下来 两个 兴趣 内容 形式 问题 学习 选择 配置 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 广州点锐网络技术有限公司 软件开发者怎么挣钱 泰州网络营销软件开发业务流程 网络安全保障制度体系建设 服务器漏洞扫描 环境系统与数据库技术论文 蛋白水平表达差异分析数据库 校园教职工网络安全培训情况 用友应收管理数据库 新基建网络安全 涉密网络安全保密产品应选用 服务器价格对比 济南网络安全大赛 互联网科技方面有哪些专业 网络安全企业绿盟排名 网络安全知识证书下载 常州服务器机柜价格 软件开发中每个阶段 装了安全狗服务器很卡 安徽c语言软件开发如何收费 软件开发专业 论文 nba2k21服务器无法正常使用 广东众家乐互联网科技有限公司 百度网络安全部门是谁 网络安全 互联网大会 青岛天欣网络技术有限公司欠费 流媒体服务器集群 仙桃数据库总经理 软件开发桌面指纹仪哪家便宜 社区管理系统数据库和实体关系图
0