
Mybatis【2.3】-- Mybatis一定要使用commit才能成功修改数据么?
发布日期:2021-05-08 23:24:21
浏览次数:15
分类:博客文章
本文共 2500 字,大约阅读时间需要 8 分钟。
代码直接放在Github仓库【
为什么我们有时候不使用commit也能修改数据库成功?
目录
1.从数据库的层面上来讲,其实这个主要看你用什么“存储引擎”
像以下的代码就是使用了自动提交的mysql引擎。
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,查看参数如下: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
比如下面的代码:
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
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;
我们再执行插入时,发现控制台输出是这样的:
好像输入也成功了,但是我去数据库看了一下,居然是空的:
那我们将代码换成这样,加入提交事务:
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()
就会自动回滚再关闭。 【作者简介】:
秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年03月26日 10时29分58秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
[apue] popen/pclose 疑点解惑
2021-05-09
[apue] getopt 可能重排参数
2021-05-09
移动互联网恶意软件命名及分类
2021-05-09
adb shell am 的用法
2021-05-09
PySide图形界面开发(一)
2021-05-09
Android如果有一个任意写入的漏洞,如何将写权限转成执行权限
2021-05-09
三角网格体积计算
2021-05-09
现代3D图形编程学习-基础简介(2) (译)
2021-05-09
Github教程(3)
2021-05-09
vue实现简单的点击切换颜色
2021-05-09
vue3 template refs dom的引用、组件的引用、获取子组件的值
2021-05-09
深入浅出mybatis
2021-05-09
Zookeeper快速开始
2021-05-09
882. Reachable Nodes In Subdivided Graph
2021-05-09
402. Remove K Digits
2021-05-09
375. Guess Number Higher or Lower II
2021-05-09
650. 2 Keys Keyboard
2021-05-09
764. Largest Plus Sign
2021-05-09
214. Shortest Palindrome
2021-05-09
916. Word Subsets
2021-05-09