为了账号安全,请及时绑定邮箱和手机立即绑定

引用 Hibernate的rollback方法

标签:
Java

rollback方法就是事务的回滚.今天在学习Hibernate的时候忽然想到这样一个小问题..算是细节吧..把这个小例子放上来..

看下面的代码(只把测试方法放上来了..使用JUnit4)

@Test
?public void testSave()
?{
tc = session.beginTransaction();

try
{
User user = new User();
user.setName("张三");
user.setBirthday(new Date());
user.setPassword("123");

session.save(user);//这句执行完以后还没发出Insert语句.
?
tc.commit();//这句执行完以后才发出insert语句..

throw new RuntimeException();

}catch(Exception e)
{
tc.rollback();
e.printStackTrace();
}

//tc.commit();
?}

(1)现在的问题是:后米看的 rollback方法有用.也就是说,这个保存到数据库的对象有没被保存

这个问题,一般人也许都能猜出来.数据是不会回滚的.也就是说,数据库里面有一条user对应的数据..

(2)下一个问题,我们把 throw new RuntimeException(); 这句放到 tc.commit(); 前面..这样子,很明显,user 是不会被存入数据库的..因为,程序压根就没执行commit方法...

(3)最后,我们总结下,一个事务从开始到提交.

1>.如果,抛出异常的地点在这个时期外,就比如我(1)中说的,程序调用了rollback方法,但是,实际上,不算是"回滚"了,因为事务已经结束...可以说,回滚已经没有作用..

2>如果,抛出异常的地点在这个时期内,就比如我(2)中说的.程序也调用了rollback方法..但是,问题在于,Hibernate压根就还没发出insert语句...那么,回滚的意义何在??

?

下面就开始说,我所知道的rollback方法的用处..

commit?之前,你修改的只是内存里的数据,commit是将你对内存所做的
修改存入数据库里面。
rollback是将从上次commit以来所做的修改全部抹掉。下次commit也
不会将这些修改存入数据库了。

可以看下面这个测试方法

@Test
?public void testSave()
?{
tc = session.beginTransaction();

try
{
User user = new User();
user.setName("张三");
user.setBirthday(new Date());
user.setPassword("123");

session.save(user);

session.flush();//这句执行结束就发出Insert?语句.

User user2 = new User();
user2.setName("张三");
user2.setBirthday(new Date());
user2.setPassword("123");

session.save(user2);

throw new RuntimeException();

// tc.commit();

}catch(Exception e)
{
tc.rollback();
e.printStackTrace();
}

//tc.commit();
?}

执行结束以后,可以看到,数据库里没有任何的数据.

终归到底,是我之前对回滚的意思没有理解
转载动态网站制作指南

点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消