千家信息网

Spring中事务的传播属性总结

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇内容主要讲解"Spring中事务的传播属性总结",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"Spring中事务的传播属性总结"吧!我们用Spring时
千家信息网最后更新 2026年10月31日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安全错误 数据库的锁怎样保障安全 新华互联网科技学校 互联网与科技发展 互联网科技战争 互联网科技金融 亿账通互联网科技 科技互联网公司logo 伴你行互联网科技有限公司 上海万想互联网科技 互联网金融监管科技 互联网为啥属于高科技 昭通互联网科技选哪家 江阴互联网智能科技产品进口 本届互联网博览会上的黑科技 互联网科技和法律行业 互联网科技大赛获奖感言 福建互联网展示科技馆设计 陕西九四连强互联网科技有限公司 数字互联网科技有限公司 科技互联网专业工作会议发言稿 安徽九吞吴互联网科技有限公司 咖啡网 深圳九邦互联网科技有限公司 互联网最新的科技有限公司 撒么互联网科技公司 上海卓越科技 互联网 甘肃拓世互联网科技有限公司 顺网科技2021年互联网排名 智腾互联网科技有限公司 北京天晋互联网科技有限公司 数字科技和互联网金融哪个好
0