Mybatis【2.3】-- Mybatis必定要使用commit才能成功修改數據麼?

代碼直接放在Github倉庫【https://github.com/Damaer/Myb...】,mybatis-02可直接運行,就不佔篇幅了。java

爲何咱們有時候不使用commit也能修改數據庫成功?mysql

[TOC]git

1.從數據庫的層面上來說,其實這個主要看你用什麼「存儲引擎」

像如下的代碼就是使用了自動提交的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。數據庫

2.使用myIsam引擎,不須要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

3.建立數據表(使用Innodb),也不提交,結果沒有插入

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()就會自動回滾再關閉。

【做者簡介】
秦懷,公衆號【秦懷雜貨店】做者,技術之路不在一時,山高水長,縱使緩慢,馳而不息。這個世界但願一切都很快,更快,可是我但願本身能走好每一步,寫好每一篇文章,期待和大家一塊兒交流。

此文章僅表明本身(本菜鳥)學習積累記錄,或者學習筆記,若有侵權,請聯繫做者覈實刪除。人無完人,文章也同樣,文筆稚嫩,在下不才,勿噴,若是有錯誤之處,還望指出,感激涕零~

相關文章
相關標籤/搜索