0

我试图理解为什么在某些情况下我需要使用@Transactional,让我们看看。

如果我在没有@Transactional 注释的情况下使用此方法,jboss 会在日志中返回:“自己关闭连接。为你关闭连接”。

public void doSomething() {

        ((Session) em.getDelegate()).doWork(new Work() {
            @Transactional(TransactionPropagationType.NEVER)
            public void execute(Connection connection) throws SQLException {
                StringBuilder sqlSP = new StringBuilder();
                sqlSP.append("{ call ");
                sqlSP.append("myprocedure");
                sqlSP.append("(?)}");

                connection.setReadOnly(true);
                CallableStatement cs = connection.prepareCall(sqlSP.toString());

                cs.setInt(1, 1020);             
                cs.execute();

                //FORCE A EXCEPTION and JBOSS SHOW "Closing connection for you"
                throw new MyException("FATAL ERROR");
            }
        });
    }

但是当我输入“@Transactional”时,问题就消失了,我不明白为什么。有人可以解释一下吗?

4

1 回答 1

2

处理数据库调用的标准方法是: 1. 打开连接 2. 打开会话和/或事务 3. 做事 4. 关闭事务和/或季节 5. 关闭连接

这基本上就是该注释为您所做的;)我强烈建议您了解更多有关处理此类事情的信息。

于 2016-01-28T14:31:28.767 回答