@Transactional不回滚事务

时间:2014-10-22 12:42:40

标签: java java-ee transactions jta transactional

我在Glassfish 4.1应用服务器上测试JTA1.2 @Transactiona l注释时遇到问题。 如果我运行这个bean的execute()方法:


@Named
@RequestScoped
public class IndexController {

    @Resource(name = "ds")
    private DataSource ds;

    @Transactional
    public void execute() throws SQLException, SystemException {
        try (Connection con = ds.getConnection();) {
            try (PreparedStatement ps = con.prepareStatement(
                    "INSERT INTO test(id) VALUES(1)"
            );) {
                ps.executeUpdate();
                throw new IllegalArgumentException();
            }
        }
    }
}

我得到预期的错误:

    Caused by: javax.transaction.RollbackException: Transaction marked for rollback.

但是当我执行select语句时:

SELECT * FROM test;

我看到插入了一行。怎么了?

1 个答案:

答案 0 :(得分:0)

您使用的是什么数据库以及它在哪种模式下?也许我没有看到它,但你在哪里做回滚?因此,在您回滚之前,该条目仍将临时写入DB。试试这个:

@Transactional(rollbackOn={Exception.class})

在catch块中,你将调用rollback方法。因为事务只标记为回滚,并且您有责任将其回滚。