a864473066 2016-11-11 02:33 采纳率: 50%
浏览 4350

SH框架下service加入事物控制后,在service方法中开启线程,run方法会加入事物中吗?

下面是applicationContext.xml的配置文件:

 <!-- Bean代理事务 -->
    <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">  
        <property name="beanNames">  
            <list>  
                <value>*Dao</value>
                <value>*Service</value>
                <value>*ServiceImpl</value>
            </list>  
        </property>  
        <property name="interceptorNames">  
            <list>  
                <value>transactionInterceptor</value>  
            </list>
        </property>  
    </bean>

加入了事物控制的service方法:

 public void savePayMentBillCode(List<PaymentExt> paymentExtList) throws ServiceException {
        try {
            for(PaymentExt paymentExt:paymentExtList) {
                paymentExt.setDataStatus(BusinessConstant.ExternalDataStatus.SAVE);
                paymentExtDao.save(paymentExt);
            }
            //创建另一个线程去执行复杂的保存操作。
            new Thread(new PaymentThreadService(paymentExtList,paymentDataService)).start();
        } catch (Exception e) {
            e.printStackTrace();
            logger.info(e.getMessage());
            throw new ServiceException("保存报文信息异常!" + e.getMessage());
        }
    }

线程的run方法:

 public class PaymentThreadService extends AbstractService implements Runnable{


    private List<PaymentExt> paymentExtList;
    private PaymentDataService paymentDataService;

    public PaymentThreadService(){}

    public PaymentThreadService(List<PaymentExt> paymentExtList,PaymentDataService paymentDataService) {
        this.paymentExtList = paymentExtList;
        this.paymentDataService = paymentDataService;
    }

    @Override
    public void run() {
        try {
            for (PaymentExt paymentExt : paymentExtList) {
                paymentDataService.outerSetlBizType(paymentExt,null);
            }
        } catch (Exception e) {
            e.printStackTrace();
            logger.info(e.getMessage());
            throw new ServiceException("多线程-保存报文信息异常!" + e.getMessage());
        }
    }
}
 paymentDataService.outerSetlBizType(paymentExt,null);

这段代码中有很多保存操作。

当run方法运行结束后,这些保存操作会被事物提交吗?我在测试时会出现:row was updated or deleted by another transaction (or unsaved-value mapping was incorrect);错误。

好像run方法结束会并没有把session自动结束,还管理着保存的对象,导致其他方法试图获取这些对象时出现上面的异常。

求教谢谢!

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2016-11-12 14:38
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 有偿求码,CNN+LSTM实现单通道脑电信号EEG的睡眠分期评估
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)
  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路