【问题标题】:How to manage 2 DAO methods in a single transaction?如何在单个事务中管理 2 个 DAO 方法?
【发布时间】:2015-07-17 21:03:38
【问题描述】:

我需要在一个事务中管理 2 个 Dao 方法,其中任何一个失败都应该回滚另一个。调用方法在服务层。 Spring 和 Hibernate 原生 sql 查询中使用的技术。有没有办法做到这一点?
调用方法:: @Transactional(propagation= Propagation.REQUIRED) public String save(AllowFileTypesForm formBeanObj,Hashtable global)

调用方法1::

public  boolean deleteData( String strTableName,String strWhereClause)  {
      Session session = sessionFactory.getCurrentSession();                                  
      String strSqlQuery = null;
      boolean deleted=false;
      strSqlQuery = "DELETE FROM Persons where" + strWhereClause;
      try {
           Query query=session.createSQLQuery(strSqlQuery);  
            if (query.executeUpdate() <= 0) {
              throw new SQLException("No row deleted from table "      +strTableName);
        }
          else{
            deleted=true;
        }
    } 

          catch(Exception e){
          e.printStackTrace();
      }
      return deleted;
   }

与此方法类似,还有另一种方法可以从其他表中删除数据。

【问题讨论】:

  • 是的。使您的服务方法具有事务性。这是典型的做法。为什么您的服务层还不是事务性的?你的代码在哪里?
  • 我的服务层已经是事务性的,但我发现的问题是回滚没有发生,我认为原因是@Transactional 支持实体持久性而不是行插入。我已经发布了代码。
  • 你所说的“失败”到底是什么意思?因为上面的代码捕获了所有可能发生的异常并忽略它们,从而有效地防止了事务在抛出异常的情况下回滚。

标签: spring hibernate spring-mvc spring-transactions native-sql


【解决方案1】:

它不会回滚,因为您正在捕获异常。 Spring 的事务管理通过 @Transactional AOP 检测到的退出事务边界的异常来工作。

如果你捕获了一个用于日志记录的 sql 异常或一些你必须重新抛出或抛出一个新异常来启动回滚的东西。

【讨论】:

    【解决方案2】:

    在您调用这些 DAO 方法的服务方法上添加 @TransactionalThis 文章很好地总结了它的工作原理。

    【讨论】:

    • 我添加了它,但它不适用于本机 sql 查询。请在上面找到我的代码。
    猜你喜欢
    • 2016-01-24
    • 2017-06-18
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多