亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

引用 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人點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
JAVA開發工程師
手記
粉絲
168
獲贊與收藏
3550

關注作者,訂閱最新文章

閱讀免費教程

感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消