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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料