Mybatis 框架—`事务管理`机制


Mybatis 框架—事务管理机制

Mybatis框架,使用 JDBC进行事务管理时,意味着将事务交给jdbc管理。

使用 JDBC 管理事务时,一般需要在代码里设置开启事务:

  1. 开启事务:sqlSessionFactory.openSession(),底层实际上执行的是 conn.setAutComit(false)
  2. 开启事务,意味着你执行的sql它不会自动提交到数据库,这时候数据库也就不会真正执行你要执行的sql语句。
  3. 所以,使用 JDBC开启事务时,一般也需要手动设置事务的提交sqlSession.commit()。这样你提交的sql语句在经过JDBC管理后,才会真正的提交给数据库执行。
  4. JDBC 开启事务管理:sqlSessionFactory.openSession(),一定不要忘了设置手动提交:sqlSession.commit()。 这样,你代码里的sql才会被JDBC 提交给数据库去执行。否则,你开启了事务管理,没有提交的操作,你的代码sql就不会被JDBC提交给数据库,也就造成你代码里每次的要执行的sql并没有被数据库真正执行。 通俗讲,你的 insert into user (userId,userName) values ("001","用户名称")这个sql不会被数据库执行,你的这个插入操作不会有数据新增。

如果使用 JDBC 管理事务时,不手动设置事务管理——这里用另一种说法就是JDBC不开启事务管理,重点是事务管理,它是使用默认的事务管理机制。

  1. JDBC 默认的事务机制下,底层执行的是默认的设置 conn.setAutComit(true)
  2. 这时候,你每传入一个sql执行代码,JDBC 会将sql进行一次提交操作,给数据库执行一次。意味着,不会存在事务管理这一说法。

总结

  1. 使用 JDBC 开启事务管理,实际上是关闭默认的事务管理机制。开启这个操作,实际是在底层逻辑里执行conn.setAutComit(false)代码。
  2. JDBC 不开启事务管理,表示采用默认的事务机制是:只要执行任意一条DML语句,JDBC 就进行一次提交操作。实际是在底层逻辑里执行conn.setAutComit(true)代码。
  3. 使用 JDBC 开启事务管理,意味着代码里执行的sql不会立即被JDBC提交给数据库,一定要搭配手动提交这个操作:sqlSession.commit()

那么问题来了,为什么要开启事务管理?采用默认的事务机制不好吗,sql代码自动提交给数据库执行,也不需要所谓的事务管理这一操作。

为什么一般都建议,使用mybatis框架时要在代码里修改成开启事务管理?使用场景是什么,或者说这么干的目的是啥?

SpringBoot
JAVA-技能点
Mybatis