我创建了一个简单的spring应用程序来测试Spring声明式事务的基础知识。 根据规则声明,事务应该在RuntimeException的情况下回滚。 但它并没有在我的情况下回滚。
主测试类有代码
public class SpringOraTest {
public static void main(String[] args) {
ApplicationContext aplctx= new
FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml");
//Call to test Declarative Transaction with Annotation
TrxHandleAnnotated prxyobj=((TrxHandleAnnotated)aplctx.getBean("dbCommandAnnotated"));
prxyobj.doTask();
}
}
TrxHandleAnnotated类有代码: -
@Transactional
public class TrxHandleAnnotated
public void doTask(){
ApplicationContext aplctx= new
FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml");
JdbcTemplate jdbcTemplate= (JdbcTemplate)aplctx.getBean("jdbcTemplate");
jdbcTemplate.update("insert into kau_emp values(4,'forthmulga' )");
throw new RuntimeException();
}
配置XML中需要配置。
我希望在抛出异常时回滚事务。但它没有回滚,记录被提交给DB。
即使经过长时间的互联网搜索,我也无法理解为什么没有回滚。
后来我意识到,在doTask()代码中,我再次创建了上下文,并将我们的JdbcTemplate实例从新的上下文中取出。这是问题的根本原因。
我改变了代码,两个类都使用了一些上下文。它工作!!!
public class SpringOraTest {
public static ApplicationContext aplctx;
public static void main(String[] args) {
aplctx= new FileSystemXmlApplicationContext("src\\config\\SpringConfigForOra.xml");
//Call to test Declarative Transaction with Annotation
TrxHandleAnnotated prxyobj=
((TrxHandleAnnotated)aplctx.getBean("dbCommandAnnotated"));
prxyobj.doTask();
}
@Transactional
public class TrxHandleAnnotated
public void doTask(){
JdbcTemplate jdbcTemplate=(JdbcTemplate)SpringOraTest.aplctx.getBean("jdbcTemplate");
jdbcTemplate.update("insert into kau_emp values(4,'forthmulga' )");
throw new RuntimeException();
}
这对我来说是一个经验教训,除非另有要求,否则整个应用程序应该只使用一个上下文对象。
这听起来太明显春天的练习者但像我这样的春季新手可以做到这样愚蠢的错误。所以想分享它。
在这种特殊情况下,不是手动创建JdbcTemplate,最好将其声明为成员变量并使用setter注入。
答案 0 :(得分:-1)
在声明@TransactionConfiguration("name",ROLLBACK); //check syntax
后,在@Transactional之后使用TrxHandleAnnotated
。有关@Transcational及其用法的更多信息,请参阅this link。