首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Mybatis【2.3】-- Mybatis一定要使用commit才能成功修改数据么?

Mybatis【2.3】-- Mybatis一定要使用commit才能成功修改数据么?

原创
作者头像
秦怀杂货店
修改于 2020-11-30 06:23:24
修改于 2020-11-30 06:23:24
2.8K0
举报
文章被收录于专栏:技术杂货店技术杂货店

代码直接放在Github仓库【https://github.com/Damaer/Mybatis-Learning】,mybatis-02可直接运行,就不占篇幅了。

为什么我们有时候不使用commit也能修改数据库成功?

TOC

1.从数据库的层面上来讲,其实这个主要看你用什么“存储引擎”

像以下的代码就是使用了自动提交的mysql引擎。

代码语言:txt
AI代码解释
复制
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,查看参数如下:

代码语言:txt
AI代码解释
复制
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

比如下面的代码:

代码语言:txt
AI代码解释
复制
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),也不提交,结果没有插入

代码语言:txt
AI代码解释
复制
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; 

我们再执行插入时,发现控制台输出是这样的:

好像输入也成功了,但是我去数据库看了一下,居然是空的:

那我们将代码换成这样,加入提交事务:

代码语言:txt
AI代码解释
复制
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()就会自动回滚再关闭。

【作者简介】

秦怀,公众号【秦怀杂货店】作者,技术之路不在一时,山高水长,纵使缓慢,驰而不息。这个世界希望一切都很快,更快,但是我希望自己能走好每一步,写好每一篇文章,期待和你们一起交流。

此文章仅代表自己(本菜鸟)学习积累记录,或者学习笔记,如有侵权,请联系作者核实删除。人无完人,文章也一样,文笔稚嫩,在下不才,勿喷,如果有错误之处,还望指出,感激不尽~

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MyBatis框架:第三章:传统方式mybatis的增,删,改,查实现
准备工作 创建java Project项目,建库建表插入数据,到数据库中执行,导入jar包 添加mybatis的核心jar 添加mysql数据库连接驱动 添加log4j日记需要的核心jar 在config目录下添加 log4j.propreties代码:
Java廖志伟
2022/09/28
1780
Mybatis【2.3】-- Mybatis一定要commit才能成功修改数据库么?
如果是不支持事务的引擎,如myisam,则是否commit都没有效的。如果是支持事务的引擎,如innodb,则有系统参数设置是否自动commit,查看参数如下:
秦怀杂货店
2022/02/15
5150
Mybatis【2.3】-- Mybatis一定要commit才能成功修改数据库么?
Mybatis【3】-- Mybatis使用工具类读取配置文件以及从属性读取DB信息
在上一个demo中,处理了多个namespace的问题,那么我们可以看到代码还是会有一定的冗余,比如下面这段代码中我们每一个增删改查操作都需要读取一遍配置文件:
秦怀杂货店
2020/11/28
8600
Mybatis【3】-- 封装工具类读取数据库配置以及获取SqlSession对象
在上一个demo中,处理了多个namespace的问题,那么我们可以看到代码还是会有一定的冗余,比如下面这段代码中我们每一个增删改查操作都需要读取一遍配置文件:
秦怀杂货店
2022/02/15
5930
Mybatis【2】-- Mybatis多个mapper文件以及namespace作用是什么?
在这里我们必须重新说一下Mybatis的运行大概过程:首先我们通过Resources.getResourceAsStream("mybatis.xml")读取到mybatis.xml这个文件,这个文件里面配置的都是整个项目与数据库相关的配置,比如运行的时候的数据库环境(连接哪一个数据库,数据库服务器的地址,用户名,密码),或者是配置外部配置文件等,最重要的是,这个文件注册了映射文件(mapper文件),那么我们使用SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);的时候,sqlSessionFactory回去读取mybatis.xml里面读取的配置文件,并且会逐一获取每一个配置文件读取到的Mapper映射文件,当我们使用openSession()获取到sqlSession的实例的时候,比如我们使用sqlSession.insert("insertStudent",student);,就会去查找每一个mapper里面的sql配置语句,也就是类似于下面这种:
秦怀杂货店
2020/11/22
1K0
Mybatis【2】-- Mybatis多个mapper文件以及namespace作用是什么?
Mybatis【2.2】-- Mybatis关于创建SqlSession源码分析的几点疑问?
当我们使用inputStream = Resources.getResourceAsStream("mybatis.xml");的时候,我们并需要去关闭inputstream,我们可以查看源码,首先看到SqlSessionFactoryBuilder().build()这个方法:
秦怀杂货店
2020/11/28
2570
Mybatis【2.2】-- Mybatis关于创建SqlSession源码分析的几点疑问?
Mybatis【8】-- Mybatis返回List或者Map以及模糊查询怎么搞?
sql语句如下,返回类型是Student,这里写的是别名,这是因为定义过别名,否则需要写全路径名:
秦怀杂货店
2022/02/15
1.6K0
Mybatis【1】-- Mybatis入门之第一个程序
Mybatis本来是Apache的一个开源项目iBatis,这个项目2010年由Apache迁移到了Google,更名为Mybatis,2013年正式迁移到Github。
秦怀杂货店
2020/11/22
3600
Mybatis【1】-- Mybatis入门之第一个程序
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
前面我们学会了Mybatis如何配置数据库以及创建SqlSession,那怎么写呢?crud怎么写?
秦怀杂货店
2020/12/05
4640
Mybatis【5】-- Mybatis多种增删改查那些你会了么?
Mybaits深入了解(二)—-入门实例
Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件、甚至是套接口服务器、NT的事件记录器、UNIXSyslog守护进程等;我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码。 此外,通过Log4j其他语言接口,您可以在C、C++、.Net、PL/SQL程序中使用Log4j,其语法和用法与在Java程序中一样,使得多语言 分布式系统得到一个统一一致的日志组件模块。而且,通过使用各种第三方扩展,您可以很方便地将Log4j集成到J2EE、JINI甚至是SNMP应用中。想要详细了解的话可以看看下面的博客:log4j.properties 详解与配置步骤。在本项目中的配置:
令仔很忙
2018/09/14
4150
Mybaits深入了解(二)—-入门实例
Mybatis【4】-- 关于Mybatis别名定义
其实在我们实际开发中,大多数情况下,一个mapper.xml文件对应的是对一个对象的操作,当前的mapper如下:
秦怀杂货店
2020/11/28
6110
Mybatis【4】-- 关于Mybatis别名定义
MyBatis学习笔记(一) --- MyBatis入门
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。 
挽风
2021/04/13
1.4K0
MyBatis学习笔记(一) --- MyBatis入门
Mybatis入门
② sql语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
乐心湖
2021/01/18
4590
Mybatis入门
Mybatis【16】-- Mybatis多对一关联查询
注:代码已托管在GitHub上,地址是:https://github.com/Damaer/Mybatis-Learning ,项目是mybatis-12-many2one,需要自取,需要配置maven环境以及mysql环境(sql语句在resource下的test.sql中),觉得有用可以点个小星星。
秦怀杂货店
2021/01/30
3850
Mybatis增删改查操作
1. 增加数据操作 编写UserMapper映射文件 <!--插入操作--> <insert id="add" parameterType="com.xdr630.domain.User"> insert into user values(#{id},#{username},#{password}) </insert> 创建user表 [在这里插入图片描述] User实体类 public class User { private int id; private String user
兮动人
2022/03/06
5880
手把手搭建mybatis入门程序
  创建Project:建议创建Empty Project,设置Java版本以及编译版本等。
一个风轻云淡
2023/10/15
1710
手把手搭建mybatis入门程序
Mybatis【10】-- Mybatis属性名和查询字段名不同怎么做?
很多时候我们有这样的需求,数据库的字段名与实体类的属性名不一致,这个时候我们需要怎么做呢?有两种解决方案,第一种:直接在查询的时候使用别名,将别名设置成与实体类的属性名一致。第二种:使用resultType,自己定义映射关系。
秦怀杂货店
2020/12/26
5840
Mybatis【10】-- Mybatis属性名和查询字段名不同怎么做?
很多时候我们有这样的需求,数据库的字段名与实体类的属性名不一致,这个时候我们需要怎么做呢?有两种解决方案:
秦怀杂货店
2022/02/15
5220
Mybatis【10】-- Mybatis属性名和查询字段名不同怎么做?
MyBatis 增删改查
  如果需要插入多行数据要么操作多次进行插入,想要一次操作插入多行数据就需要使用动态 SQL 中的 foreach 了,其他配置与新增单个基本一致只需要修改 mapper 和 DAO 接口即可。
Demo_Null
2020/09/28
1.6K0
MyBatis 增删改查
MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
②sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java代码。
共饮一杯无
2022/11/28
4710
MyBatis从入门到精通(一)—MyBatis基础知识和快速入门
推荐阅读
相关推荐
MyBatis框架:第三章:传统方式mybatis的增,删,改,查实现
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档