在多个DAO spring mvc中设置AutoCommit False

时间:2015-04-21 16:51:02

标签: java spring-mvc jdbc rollback

我是实施JDBC的新手。我正在构建一个注册页面,我需要在其中将行插入多个表中。

对于每个表,我使用DAO,在一个服务类中,我调用所有DAO的插入方法。在每个DAO插入方法中,我使用数据源创建新连接并执行。

现在,如果在插入时发生任何错误,我想回滚所有插入语句。

我知道有

   connection.setAutoCommit(false)

现在,我如何创建一次连接并在其他DAO中重复使用它。所以,我可以使用保存点和回滚机制

除了发送连接作为参数之外还有其他方法。

我怎么能实现这个目标?

以下是服务页面的示例代码:

     Sucessfull = firstDAO.save(firstDAOObj);
    if(Sucessfull){
        Sucessfull = secondDAO.save(secondDAOObj);
    }
    if(Sucessfull){
        Sucessfull = thirdDAO.save(thirdDAOObj);
    }

2 个答案:

答案 0 :(得分:0)

我认为这会对你有帮助

try{
   //Assume a valid connection object conn
   conn.setAutoCommit(false);
   Statement stmt = conn.createStatement();

   String SQL = "INSERT INTO Employees  " +
                "VALUES (106, 20, 'Rita', 'Tez')";
   stmt.executeUpdate(SQL);  
   //Submit a malformed SQL statement that breaks
   String SQL = "INSERTED IN Employees  " +
                "VALUES (107, 22, 'Sita', 'Singh')";
   stmt.executeUpdate(SQL);
   // If there is no error.
   conn.commit();
}catch(SQLException se){
   // If there is any error.
   conn.rollback();
}

答案 1 :(得分:0)

我不确定你为什么每个表都使用DAO(我假设你的所有表都在同一个数据库中)。我可能会使用一个DAO。我也不会为每个呼叫使用单独的连接。这是我用于此类事情的通用模板:

我把它放在我DAO的顶部:

private DataSource myDs= new JndiDataSourceLookup().getDataSource("<string name of your datasource>");
private DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(myDs);
private SimpleJdbcTemplate sjt = new SimpleJdbcTemplate(myDs);

然后再向下我在一个方法中有这样的东西,我传入包含我想要插入的数据的对象。这个DAO方法将由您的服务层类调用:

DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
    // put all of your inserts in here using the SimpleJdbcTemplate 
    // that was declared above

    transactionManager.commit(status);
} catch(Throwable t) {
    try {
        transactionManager.rollback(status);
    } catch (Throwable t2) {
        log.error("Error rolling back transaction", t2);
    }
    throw new DataAccessException(t);
}

使用Spring还有其他方法可以进行交易,其中一种方法包括注释,但可能会有点复杂。我建议您考虑将来的应用程序。