继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

引用 Hibernate的rollback方法

quincyye
关注TA
已关注
手记 235
粉丝 168
获赞 3550

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();
?}

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

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

打开App,阅读手记
1人推荐
发表评论
随时随地看视频慕课网APP