精华内容
下载资源
问答
  • Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的 setAutoCommit()方法来设置事务提交方式的。来跟踪源码验证这个事实 1跟踪源码 1.1org/apache/ibatis/session/SqlSession....

    Mybatis 的事务控制

    面试常问

    • 事务是什么
    • 事务的四大特性ACID
    • 不考虑隔离性会产生的3个问题
    • 解决方法:四种隔离级别

    通过sqlsession对象的commit方法和rollback方法实习事务提交和回滚

    Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的 setAutoCommit()方法来设置事务提交方式的。来跟踪源码验证这个事实

    1跟踪源码

    1.1org/apache/ibatis/session/SqlSession.java

    在这里插入图片描述

    1.2org/apache/ibatis/session/defaults/DefaultSqlSession.java

    在这里插入图片描述

    1.3org/apache/ibatis/executor/Executor.java

    在这里插入图片描述

    1.4通过UML Diagram追踪到BaseExecutor

    在这里插入图片描述

    1.5 org/apache/ibatis/executor/BaseExecutor.java

    在这里插入图片描述

    1.6org/apache/ibatis/transaction/Transaction.java

    在这里插入图片描述

    1.7找到实现类JdbcTransaction

    在这里插入图片描述

    1.8org/apache/ibatis/transaction/jdbc/JdbcTransaction.java

    在这里插入图片描述

    protected void setDesiredAutoCommit(boolean desiredAutoCommit) {
    。。。。
            log.debug("Setting autocommit to " + desiredAutoCommit + " on JDBC Connection [" + connection + "]");
         。。。。。
    }
    

    在这里插入图片描述

    2.自动提交事务

    为什么 CUD 过程中必须使用 sqlSession.commit()提交事务?

    主要原因就是在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法,这样我们就必须使用 sqlSession.commit()方法,相当于使用了 JDBC 中的 connection.commit()方法实现事务提 交。

    SqlSessionFactory

    public interface SqlSessionFactory {
    
      SqlSession openSession();
    
      SqlSession openSession(boolean autoCommit);
      SqlSession openSession(Connection connection);
      SqlSession openSession(TransactionIsolationLevel level);
    
      SqlSession openSession(ExecutorType execType);
      SqlSession openSession(ExecutorType execType, boolean autoCommit);
      SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
      SqlSession openSession(ExecutorType execType, Connection connection);
    
      Configuration getConfiguration();
    
    }
    

    修改@before中的openSession方法的true,默认是flase,就不用在@after中加入sqlSession.commit()

        @Before//用于在测试方法执行之前执行
        public void init() throws IOException {
            //1.读取配置文件
            in = Resources.getResourceAsStream("SqlMapperConfig.xml");
            //2.创建SqlSessionFactory工厂对象,获得数据源配置信息
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            SqlSessionFactory factory = builder.build(in);
            //3.工厂对象根据信息创建SqlSession对象
            sqlSession = factory.openSession(true);
            //4.使用SqlSession创建Dao接口的动态代理对象
            userDao = sqlSession.getMapper(UserDao.class);
        }
    
        @After    //用于在测试方法执行之后执行
        public void destroy()throws Exception{
            //提交事务,如果不提交,会回滚操作,表数据直接跳一行
    //        sqlSession.commit();
            //6.释放资源
            sqlSession.close();
            in.close();
        }
    

    测试保存autocommit,不适用实际一个方法中多个需要事务控制sql,在Spring中会用AOP解决

    在这里插入图片描述

    展开全文
  • Mybatis自动提交事务

    2021-02-06 20:16:04
    学习Mybatis的小伙伴都知道,当我们使用Mybatis将Java和数据库连接后,利用.java文件编写对数据库进行insert、delete、update操作的sql语句时,Mybatis默认不自动提交事务,数据库中的数据不会改变。 所以要手动...

    学习Mybatis的小伙伴都知道,当我们使用Mybatis将Java和数据库连接后,利用.java文件编写对数据库进行insert、delete、update操作的sql语句时,Mybatis默认不自动提交事务,数据库中的数据不会改变。

    所以要手动提交事务:

     sqlSession.commit();

    如果想让程序自动提交事务:

     //5.【重要】获取SqlSession对象,从SqlSessionFactory中获取SqlSession
            SqlSession sqlSession = factory.openSession();

    改为

     //5.【重要】获取SqlSession对象,从SqlSessionFactory中获取SqlSession
            SqlSession sqlSession = factory.openSession(true);

    就是在openSession方法中加上参数“true”。

    展开全文
  • Mybatis事务提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制。 我们运行之前所写的代码: @Test public void testSaveUser() throws Exception { User user = new User(); user.setUsername(...

    Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制。
    我们运行之前所写的代码:

    @Test
    public void testSaveUser() throws Exception {
    User user = new User();
    user.setUsername("mybatis user09");
    //6.执行操作
    int res = userDao.saveUser(user);
    System.out.println(res);
    System.out.println(user.getId());
    }
    
    @Before//在测试方法执行之前执行
    public void init()throws Exception {
    //1.读取配置文件
    in = Resources.getResourceAsStream("SqlMapConfig.xml");
    //2.创建构建者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //3.创建 SqlSession 工厂对象
    factory = builder.build(in);
    //4.创建 SqlSession 对象
    session = factory.openSession();
    //5.创建 Dao 的代理对象
    userDao = session.getMapper(IUserDao.class);
    }
    @After//在测试方法执行完成之后执行
    public void destroy() throws Exception{
    //7.提交事务
    session.commit();
    //8.释放资源
    session.close();
    in.close();
    }
    

    观察在它在控制台输出的结果:

    Opening JDBC Connection
    Created connection 982007015
    Setting autocommit to false on JDBC Connection[com.mysql.jdbc.JDBC4Connection@3a883ce7]
    Committing JDBC Connection[com.mysql.jdbc.JDBC4Connection@3a883ce7]
    

    这是我们的 Connection 的整个变化过程,通过分析我们能够发现之前的 CUD 操作过程中,我们都要手动进 行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中, 必须通过 sqlSession.commit()方法来执行提交操作。

    Mybatis 自动提交事务的设置
    通过上面的研究和分析,现在我们一起思考,为什么 CUD 过程中必须使用 sqlSession.commit()提交事 务?主要原因就是在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法,这样我们 就必须使用 sqlSession.commit()方法,相当于使用了 JDBC 中的 connection.commit()方法实现事务提交。
    明白这一点后,我们现在一起尝试不进行手动提交,一样实现 CUD 操作。

    @Before
    //在测试方法执行之前执行
    public void init()throws Exception {
    //1.读取配置文件
    in = Resources.getResourceAsStream("SqlMapConfig.xml");
    //2.创建构建者对象
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //3.创建 SqlSession 工厂对象
    factory = builder.build(in);
    //4.创建 SqlSession 对象
    session = factory.openSession(true);
    //5.创建 Dao 的代理对象
    userDao = session.getMapper(IUserDao.class);
    }
    @After//在测试方法执行完成之后执行
    public void destroy() throws Exception{
    //7.释放资源
    session.close();
    in.close();
    }
    所对应的 DefaultSqlSessionFactory 类的源代码:
    @Override
    public SqlSession openSession(Boolean autoCommit){
    retuen openSessionFromDataSource(configuration.getDefaultExecutorType(), null, autoCommit);
    
    }
    
    展开全文
  • mybatis自动提交事务管理

    万次阅读 2017-08-22 16:28:20
    关于mybatis事务的回滚与提交的官方说明如下: 事务控制方法 控制事务作用域有四个方法。 当然, 如果你已经选择了自动提交或你正在使用外部事务管 理器,这就没有任何效果了。然而,如果你正在使用 JDBC 事务管理...
    关于mybatis的事务的回滚与提交的官方说明如下:
    事务控制方法
    控制事务作用域有四个方法。 当然, 如果你已经选择了自动提交或你正在使用外部事务管 理器,这就没有任何效果了。然而,如果你正在使用 JDBC 事务管理员,由 Connection 实 例来控制,那么这四个方法就会派上用场:


    void commit()
    void commit(boolean force)
    void rollback()
    void rollback(boolean force)
    默认情况下 MyBatis 不会自动提交事务, 除非它侦测到有插入, 更新或删除操作改变了 数据库。如果你已经做出了一些改变而没有使用这些方法,那么你可以传递 true 到 commit 和 rollback 方法来保证它会被提交(注意,你不能在自动提交模式下强制 session,或者使用 了外部事务管理器时) 。很多时候你不用调用 rollback(),因为如果你没有调用 commit 时 MyBatis 会替你完成。然而,如果你需要更多对多提交和回滚都可能的 session 的细粒度控 制,你可以使用回滚选择来使它成为可能。


    注意MyBatis-Spring和MyBatis-Guice提供了声明事务处理,所以如果你在使用Mybatis的同时使用了Spring或者Guice,那么请参考它们的手册以获取更多的内容。


    从官方说明可以看出如果要使用事务回滚,需使用connection来获取连接或者关闭session自动提交才能实现。


    使用spring注入的方式,事务管理的方法,运行的debug如下,插入一条语句后断开连接
     


    直接使用session的方式如下,没有事务管理,只能手动关闭连接。才会归还连接
     


    事务是由spring来管理


    展开全文
  • Mybatis事务提交方式

    2020-05-29 19:35:39
    Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的 setAutoCommit()方法来设置事务提交方式的。 这是我们的 Connection 的整个变化过程,通过分析我们能够发现之前的 ...
  • mybatis事务提交

    2019-12-20 16:51:42
    import java.util.List;...* 在mapper层增加方法注释可以手动提交事务 * @author jack * @time2019-12-20 */ public interface TestMapper extends BaseMapper<Test> { //手动提交事务 ...
  • Mybatis事务控制

    2020-06-20 14:19:54
    那么我们的Mybatis框架因为是对JDBC的封装,所以Mybatis框架的事务控制方式,本身也是用JDBC的setAutoCommit()方法来设置事务提交方式的。 2.Mybatis事务提交方式 Mybatis事务提交方式,本质上就是调用JDBC的...
  • SpringBoot Mybatis 手动提交事务

    千次阅读 2020-05-19 17:56:15
    1.数据库配置文件mybatis-config-only.xml <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" ...
  • Mybatis批量事务

    千次阅读 2020-06-02 22:19:07
    Mybatis批量事务 mysql数据库不能同时支持30万数据的 一次性事务提交,需要分批次地去进行事务提交,否则数据将堆积到mysql数据库中,导致数据库性能过低。(需要采用编程式事务的方式分批次多次提交) service 层...
  • Mybatis事务控制

    千次阅读 2020-05-05 20:04:46
    事务:访问并可能更新数据库中各种数据项的...文章目录一、Mybatis 的事务控制二、Mybatis 自动提交事务的设置 一、Mybatis 的事务控制 在 JDBC 中我们可以通过手动方式将事务的提交改为手动方式,通过 setAutoComm...
  • Mybatis手动提交事务

    千次阅读 2019-02-27 14:37:36
    ... import java.util.List; import java.util.Map;... //手动提交事务 @Transactional(propagation= Propagation.REQUIRES_NEW) public void insertBalance215Data(Map, Object> list); }  
  • Mybatis事务提交问题

    2021-02-22 11:08:36
    今天遇到了mybatis执行增删改时,没有通过事务提交,即sqlSession.commit();sql语句就直接完成了对数据库的操作,首先怀疑了sqlSession的默认设置问题,是否是自动提交,排查之后,发现是数据库的引擎问题,将表数据...
  • @Service public class MyService{ @Autowired DataSourceTransactionManager transactionManager; public ResultMap lockStockWhenNewOrder(List<...获取事务定义 DefaultTransactionDefinition d.
  • MyBatis 事务 手动 提交

    2020-08-30 16:14:33
    @Autowired DataSourceTransactionManager transactionManager;...设置事务隔离级别,开启新事务 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //3.获得事务状态 Transa.
  • 在创建代理对象的时候传true
  • spring集成mybatis事务事务默认是自动提交。 需要包:mybatis-spring-xxx.jar包; spring-tx-xxxx.jar包 本质:将事务交给了spring管理 2、事务控制 2.1 事务 2.1.1 事务概念 事务:是逻辑上一组操作,要么...
  • 事务的自动提交需要的设置主要考虑三部分,Mybatis的SQLSession,连接池和数据库: 1.SqlSession默认是不自动提交的,需要手动调用commit(),如果想设置可以通过openSession的true和false参数来设置: 2.由于采用了...
  • mybatis配置事务

    2017-05-05 17:59:36
    即ORM映射框架和事务的配合使用mybatis配置mybatis主要完成java到db的映射。主要模块有datasource、sqlSessionFactory、DAO及sqlmap四个部分组成。其中datasource为数据源,目前一般用的都是mysql数据库。...
  • springmvc mybatis 手动提交事务

    万次阅读 2016-07-10 23:02:34
    public void save(User user) { //获取Spring容器的对象 WebApplicationContext contextLoader = ContextLoader....获取事务控制管理器 DataSourceTransactionManager transactionManager =
  • mybatismybatis JDBC事务细节

    千次阅读 2015-09-01 01:05:53
    mybatis事务操作细节,没有贴源码,请自行查看
  • Spring+Mybatis嵌套事务,在子事务提交后查数据为空 需求场景 public class BServiceImpl implements BSevice{ @Autowired private ASevice aSevice; @Resource(name="transactionManager") ...
  • MyBatis中设置事务自动提交

    千次阅读 2020-08-12 10:28:41
    MyBatis中设置事务自动提交 MyBatis框架是对JDBC的封装,MyBatis中的事务控制方式其本质也是JDBC的setAutoCommit()方法来设置事务提交的方式的。 1.MyBatis事务提交 public class mybatisTest { @Test public ...
  • MyBatis系列之基础入门篇(九) MyBatis事务控制 ...那么我们的 Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的setAutoCommit()方法来设置事务提交方式的。 2...
  • springaop如何接管mybatis事务 本文重点: aop的大致流程 mybatis如何把事务托管给spring 1.本文项目依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId>...
  • spring mvc mybatis 手动提交事务

    千次阅读 2019-03-21 10:35:07
    https://www.cnblogs.com/xujishou/p/6210012.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 39,879
精华内容 15,951
关键字:

mybatis提交事务