【发布时间】:2012-11-13 15:09:53
【问题描述】:
项目使用了Spring + Hibernate
示例代码:
public void method(){
try{
dao.saveA(entityA);
//condition may be throw RuntimeException;
dao.saveB(entityB);
}catch(RuntimeException e){
throw e;
}finally{
dao.saveC(entityC)
}
}
最后,只有 entityC 会被保存到数据库中进行测试。
我认为 saveA、saveB、saveC 在同一个事务中,它们不应该被提交。
在这种情况下,我想知道为什么要提交 entityC。
Spring 在 finally 块中是如何做到这一点的?
//----------------------------//
其实我的问题是:spring如何保证finally块中的事务提交。
Spring 会在 finally 块中获得新的连接吗?
【问题讨论】:
-
事务在哪里管理?为什么说只有C得救,我觉得A和C都有资格得救。 saveB() 是无法访问的代码。这个例子看起来过于简单,以至于它并不是真的有用。这是Java 7吗?他们在 Java 7 中添加了 try-with-resources,因此 try/catch/finally 块的行为有所不同。
-
throw RuntimeException不会编译,你的意思是不是像throw new RuntimeException()这样的? -
也许你应该添加关于 RuntimeException 会导致 session 被破坏并且无法使用的信息,所以其他不知道 Rollback异常时的概念,不要迷惑以为你不知道try、catch、finally的概念。
标签: java spring hibernate transactions try-catch-finally