我在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;
我看到插入了一行。怎么了?
答案 0 :(得分:0)
您使用的是什么数据库以及它在哪种模式下?也许我没有看到它,但你在哪里做回滚?因此,在您回滚之前,该条目仍将临时写入DB。试试这个:
@Transactional(rollbackOn={Exception.class})
在catch块中,你将调用rollback方法。因为事务只标记为回滚,并且您有责任将其回滚。