首先介绍一篇文章:http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html?page=1
不过有点长,我现在都差不都忘了里面讲的内容了。注意评论,里面提到文章讲的内容有些是错误的。
Spring里,如果同时存在JMS操作和DB操作,大概也就三种方式:
1.没有使用JTA。JMS不在事务中,DB操作在事务中
a,消息处理
b,开始数据库事务
c,数据库操作
d,数据库提交
成功:结束
失败:回到b重试
这种方式事务没有集成,靠的纯粹是我们程序的控制,如果最终数据库提交都没成功的话,可以记下log,再人工去纠正数据。例子里把数据库操作放在了更重要的位置,其实也可以倒过来,让数据库操作先完成,只好在做jms操作,看业务需求了:
a,开始数据库事务
b,数据库操作
c,数据库提交
d,消息处理
成功:结束
失败:回到d重试
我们只要把spring配置改成
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
...
<!-- This is important... -->
<property name="sessionTransacted" value="false" />
</bean>
再加上自己程序控制就好了。
2.如果没有使用JTA,对于上面的配置如果把属性 sessionTransacted 设成true的话,就产生了第二种方式,过程:
a,开始jms事务
b,开始数据库事务
c,数据库和jms操作
d,提交数据库操作
e,提交jms操作
a,b的顺序不肯定,不过对程序没影响,但是d,e的顺序是确定的。在Spring里,数据库会在spring的commit方法里提交,而JMS会在afterCommit方法里提交。如果数据库失败,JMS当然也就回滚了,但是如果数据库成功而JMS失败,就产生了数据不一致,就要加上其它措施。而且这里还有一个致命缺点,就是某些情况下即使JMS失败(比如JMS服务器down了),Spring也不会抛出异常,程序外部以为一切正常,而事实上以产生了不一致问题,而且很难发现。
3.如果使用了JTA那么把属性 sessionTransacted 设成true的话,JMS和数据库操作就在同一个事务里了,没什么好说,最安全的方式,但是效率很低。
分享到:
相关推荐
jms简单demo,activemq集成spring和不集成
spring-jmsspring-jmsspring-jmsspring-jmsspring-jmsspring-jms
赠送jar包:spring-jms-4.3.12.RELEASE.jar; 赠送原API文档:spring-jms-4.3.12.RELEASE-javadoc.jar; 赠送源代码:spring-jms-4.3.12.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-jms-4.3.12.RELEASE....
1) 本工程主要演示在SPRING BOOT工程中怎样使用JMS集成IBM-MQ及TLQ两种消息中间件产品 2) 使用SPRING BOOT Conditional机制实现了两种产品按需加载,工程会根据配置文件开关动态加载 3) 实现了普通队列消息发送与...
赠送jar包:spring-jms-4.3.20.RELEASE.jar; 赠送原API文档:spring-jms-4.3.20.RELEASE-javadoc.jar; 赠送源代码:spring-jms-4.3.20.RELEASE-sources.jar; 包含翻译后的API文档:spring-jms-4.3.20.RELEASE-...
赠送jar包:spring-jms-4.3.20.RELEASE.jar 赠送原API文档:spring-jms-4.3.20.RELEASE-javadoc.jar 赠送源代码:spring-jms-4.3.20.RELEASE-sources.jar 包含翻译后的API文档:spring-jms-4.3.20.RELEASE-...
spring_jms是基于Maven+Spring+JMS+Active入门级实例.
spring-jms-4.0.0.RELEASE.jar spring-jms-4.0.0.RELEASE.jar spring-jms-4.0.0.RELEASE.jar spring-jms-4.0.0.RELEASE.jar
Spring+JMS + Mysql这是一个很值得学习的例子,已经封装成了一个对象。。,Spring+JMS + Mysql
spring+jms+jta事务的消息发送和消息消费。 完整可正常运行例子,对JTA分布式事务的配置。 本例可以直接作为处理消息的项目,在此之上直接继续开发。
spring-jms-5.0.4.RELEASE.jar ;spring-jms-5.0.4.RELEASE.jar
spring-jms入门
spring-jms-4.1.4,Spring提供的JMS工具类,它发送、接收消息
spring-jms-3.1.1.RELEASE.jar
spring-jms-3.2.4.RELEASE.jar
Java网络编程--基于Spring的JMS编程
spring-jms-4.1.0.RELEASE.ja
这是本人搭建的Spring框架,集成了Weblogic JMS,测试已经完成。现提供给大家下载学习。
spring-framework.zip,spring jmsspring框架
Spring-JMS把企业消息处理变容易.doc