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();
?}
执行结束以后,可以看到,数据库里没有任何的数据.
终归到底,是我之前对回滚的意思没有理解
转载动态网站制作指南
共同学习,写下你的评论
评论加载中...
作者其他优质文章