插入操作成功,消耗了一个主键,但是数据库没有看到相关数据。一般这种情况说明可能事务没有执行成功,事务回滚了。数据库操作要通过 ACID规则来约束事务,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability)。
MyBatis中的事务是指一系列数据库操作,这些操作要么全部执行成功,要么全部执行失败。如果操作过程中发生错误,所有对数据库的修改都将被回滚,即还原到最初状态。事务是确保数据一致性和完整性的关键机制之一。
在MyBatis中,我们可以通过三种方式来管理事务:
- 编程式管理事务:在代码中显式开启、提交或回滚事务。
- 声明式管理事务:通过AOP代理实现事务管理,可以让代码更简洁,更容易维护。
- 注解式管理事务:通过注解方式管理事务,是声明式管理事务的一种扩展方式。
因为采用的是声明式事务管理(在mybatis-config.xml文件里面配置的),使用的是jdbc的事务管理器,将事务提交给mybatis处理。
但是在使用它的时候,由于我们使用的是SqlSessionFactory这个类的openSession方法来创建实例
。源码如下,可以看到最后那个值默认是false,这个值决定是否自动提交事务,false就意味着不会自动提交,需要我们手动提交
public SqlSession openSession() {return this.openSessionFromDataSource(this.configuration.getDefaultExecutorType(), (TransactionIsolationLevel)null, false);}
所以事务执行完毕后,我们手动设置一个事务提交即可。
ps:数据库的查询不需要提交事务,因为它不涉及数据的修改,也就不会影响事务的一致性原则,
所以不需要提交事务。还有有时候可能执行的操作有问题也会回滚,需要结合具体问题进行分析。