【问题标题】:spring transactions in a spawned off thread在衍生的线程中进行事务处理
【发布时间】:2011-10-27 11:32:27
【问题描述】:

我在现有系统上工作,需要让我的 Spring 事务管理器附加到从主作业线程产生的线程。我不断收到此异常

org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
    at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
    at parity.model.datamapping.RefreshTask.execute(RefreshTask.java:95)
    at com.paritysys.tasks.ASyncTask$1.run(ASyncTask.java:48)
    at java.lang.Thread.run(Thread.java:662)

我用事务注释注释了我能想到的所有内容,但我仍然无法清除此错误。

我错过了什么

我的方法

@TransactionAS400
    @TransactionScores
    public void refresh() {
        ASyncTaskWorker worker = new ASyncTaskWorker() {
            public void progress(double percentage, String message) {
                logger.debug(String.format("%.2f - %s", percentage, message));
            }

            public void handleException(Throwable e) {
                try {
                    status.allowUpdating(property.getSchema());
                } catch (Exception b) {
                    // consume
                }

                logger.error("Failed to complete the refresh task", e);
            }

            public void done(boolean success) {
                status.allowUpdating(property.getSchema());
                logger.debug(String.format(
                        "Reset updating status to default for %s",
                        property.getSchema()));
            }
        };
        RefreshTask refTask = ServiceProviderContext.find(RefreshTask.class);

        refTask.init(property, worker);

        ASyncTaskHandler.getInstance().add(refTask);
        ASyncTaskHandler.getInstance().process();
    }

【问题讨论】:

  • 您应该发布启动事务的代码以及调用它的代码。
  • 好吧,没有启动事务的代码。这就是事务注释在我的 spring bean 中所做的。我的问题似乎是,当 bean 由于某种原因生成到新线程时,它没有意识到 spring 可以在新线程中启动新事务。
  • 我希望你使用@Transactional。但是请发布调用这个带注释的方法的代码。
  • 我实际上对同一个问题感兴趣 (How to propagate Spring transaction to another thread)。那其实是Spring的意识形态,所以我们必须同意它......

标签: java spring spring-transactions


【解决方案1】:

我遇到了类似的情况,其中我有一个线程超出了 Spring 的范围。 我的建议如下: 定义并连接org.springframework.transaction.support.TransactionTemplate 的实例,然后使用:

transactionTemplate.execute(new TransactionCallback() {
    @Override
    public Object doInTransaction(TransactionStatus status) {
        //your code
    }
}

我建议事先致电transactionTemplate.setName("myTransactionsName") 以解决调试问题。

【讨论】:

    【解决方案2】:

    虽然另一个答案中建议的 TransactionTemplate 可以正常工作,但还有两个其他选项需要注意:

    1) 将方法定义为@Transactional(我不确定您使用的其他注释来自哪里)和<tx:annotation-driven> 或声明DefaultAdvisorAutoProxyCreator bean

    2) 使用<tx:advice> 和切入点定义事务。

    两者都记录在the Spring manual

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 1970-01-01
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多