代碼直接放在Github倉庫【https://github.com/Damaer/Myb...】,mybatis-02可直接運行,就不佔篇幅了。java
爲何咱們有時候不使用commit也能修改數據庫成功?mysql
[TOC]git
像如下的代碼就是使用了自動提交的mysql引擎。github
CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , `age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = MyISAM;
若是是不支持事務的引擎,如myisam,則是否commit都沒有效的。
若是是支持事務的引擎,如innodb,則有系統參數設置是否自動commit,查看參數以下:sql
mysql> show variables like '%autocommit%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | autocommit | ON | +---------------+-------+ 1 row in set (0.00 sec) mysql>
顯示結果爲on表示事務自動提交,不用手工去commit,固然,你能夠設置其爲OFF,而後本身手工去commit。數據庫
好比下面的代碼:session
public class StudentDaoImpl implements IStudentDao { private SqlSession sqlSession; public void insertStu(Student student) { try { InputStream inputStream; inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); sqlSession=sqlSessionFactory.openSession(); sqlSession.insert("insertStudent",student); } catch (IOException e) { e.printStackTrace(); } } }
咱們能夠看到已經更新了一行,咱們徹底不使用commit
mybatis
CREATE TABLE `student` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , `age` INT NOT NULL , `score` DOUBLE NOT NULL , PRIMARY KEY (`id`)) ENGINE = Innodb;
咱們再執行插入時,發現控制檯輸出是這樣的:學習
好像輸入也成功了,可是我去數據庫看了一下,竟然是空的:ui
那咱們將代碼換成這樣,加入提交事務:
public class StudentDaoImpl implements IStudentDao { private SqlSession sqlSession; public void insertStu(Student student) { try { InputStream inputStream; inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); sqlSession=sqlSessionFactory.openSession(); sqlSession.insert("insertStudent",student); // 提交事務 sqlSession.commit(); } catch (IOException e) { e.printStackTrace(); }finally { if(sqlSession!=null){ sqlSession.close(); } } } }
執行代碼,咱們會發現事務提交成功了,同時咱們也關閉數據庫了:
打開數據庫,咱們會發現,竟然沒有id爲1的記錄,爲何直接跳到2了呢?還記不記得以前插入一次可是沒有提交,因此問題就在這裏。上一次的提交已經寫到事務裏面了,只是沒有提交,因此這一次提交的時候,上一次默認已經佔用了那條記錄,只是不寫進數據庫中。有提交就能夠回滾,因此要使用回滾的話,可使用sqlsession.rollback()
。
若是咱們使用sqlsession.close()的話,咱們就不須要使用回滾了。
下面是我把commit去掉,可是留下close的結果,咱們能夠看到沒有commit,可是已經會自動rollback了,因此只要使用sqlsession.close()
就會自動回滾再關閉。
【做者簡介】:
秦懷,公衆號【秦懷雜貨店】做者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界但願一切都很快,更快,可是我但願本身能走好每一步,寫好每一篇文章,期待和大家一塊兒交流。
此文章僅表明本身(本菜鳥)學習積累記錄,或者學習筆記,若有侵權,請聯繫做者覈實刪除。人無完人,文章也同樣,文筆稚嫩,在下不才,勿噴,若是有錯誤之處,還望指出,感激涕零~