Spring 声明式事务中进行多线程操作及解析
今天项目还存在一个问题,而明天就要上线了,所以很急,主要的问题如下:
?
问题描述:主要的业务逻辑--页面上处理放行基金下单记录(主管审核以后的操作),这时候需要做的动作如下:
?
1. 把下单记录关联的档案移动到MFT(TIBCO公司产品,文档传送软件)的发送目录;
2. 更新下单记录信息(OrderInfo)的状态;
3. Daemon(JAVA注册的windows service)程序去检测MFT发送目录是否有档案,有则起一个新的Thread调用MFT Server去发送档案,MFT会自动发送到目标目录,发送成功或失败会有一个回覆信息,AP端根据这个状态去更新下单记录(OrderInfo)的状态;
?
处理以上业务逻辑的service类使用了Spring声明式事务进行管理,然后客户在测试机上反馈的信息是:
1. 抛出一下异常信息
?
最后的解决方式是,Daemon程序没有采用事务处理的bean实例faxCenter,而是使用faxCenterImpl的实例,该实例没有纳入Spring声明式事务管理,而其他地方用到的faxCenter依然是有事务管理的实例对象。
?
<property name="target" ref="faxCenterImpl" />
</bean>
这里faxCenter是纳入了事务管理的,但是我在processor中取的bean的时候使用:
引用
faxCenter = (IFaxCenter) context.getBean("faxCenterImpl");//faxCenterImpl而不是faxCenter
我的理解是,存在事务,然后多线程更新,在事务提交时,很容易造成死锁(就是因为存在行级锁)。
现在不纳入事务管理,每个线程去更新数据后立刻提交,造成死锁的概率下降了。这里只是折中的解决方式。