我想请问一下,如果hibernate的事务提交失败,我没有回滚事务,直接关闭了session。那么事务算是结束了吗?
举一个最简单的例子:
Session DBsession = sessionFactory.openSession();
Transaction t = DBsession.beginTransaction();
try{
t.begin();
………………………………
t.commit();
}catch(Exception e){
}finally{
DBsession.closed();
}
像上面的这个例子,如果t.commit()出错了,那么事务结束了吗,注意我的事务没有回滚。而且session能够被关闭吗?
其实你对事务的理解不是很正确
t.commit(); 这就是提交事物
t.rollback(); 这就是回滚事务
事物不是从 Session DBsession = sessionFactory.openSession(); 开始,到DBsession.closed(); 结束的,其实你的每一次操作都是一次事务。
Hibernate本身在设计时并不具备事务处理功能,平时所用的Hibernate的事务,只是将底层的JDBCTransaction或者JTATransaction进行了一下封装,在外面套上Transaction和Session的外壳,其实底层都是通过委托底层的JDBC或JTA来实现事务的调度功能。
[quote]
我想请问一下,如果hibernate的事务提交失败,我没有回滚事务,直接关闭了session。那么事务算是结束了吗?
[/quote]
结束了。
在catch里面
t.rollback()就会滚了。。
如果没有会滚,是可以关闭session的,不过可能会有脏数据在数据库了。。。
理论上应该是数据不会更新到数据库的。这个你可以写个测试类具体测试下。个人觉得所谓的begin只不过是告诉数据库不要在执行完后自动commit而是该有手动控制,也就是t.commit()了。既然没手工提交前就报错了,那么数据应该还是临时状态的,不会在持久的.(这个还是自己写段代码测试下,毕竟debug出的东西才是最准确的)。
比如使用MYSQL的时候,如果不在数据库上设置手动commit的话,那么用hibernate的事务时是不起作用的。这个你也可以尝试下。如果用oracle一般是没有什么问题,因为oracle默认需要执行更新操作时需要手动提交,而mysql是默认自动提交的。
至于session会关闭么,这个问题应该不用多说了 因为在finllay中,那么你的DBsession.closed();就你的这段代码来说,肯定是会被执行的。所以session(数据库连接的会话)最终是关闭了。
[quote]我们的数据库是sybase,如果session关闭了,那么事务是结束了吗?[/quote]sysbase数据库!!没用过。
不过你可以自己测试下。session关闭只是释放了应用跟数据库之间的链接,以及应用创建改session会话所占得资源.session的关闭应该跟事务没什么关系。