myBatis中openSession();却自动提交的问题

博主在学习MySQL过程中遇到自动提交问题,发现是由于表引擎设置错误导致。尽管创建表时选择了支持事务的InnoDB引擎,但实际操作中误将表引擎改为MyISAM,而MyISAM不支持事务。解决方法是将表引擎更改为InnoDB,确保支持事务处理。此外,还探讨了如何更改MySQL默认引擎为InnoDB,以避免类似问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在小破站看视频学习MySQL相关的东西,记录一下遇到的各种问题

自动提交问题

跟着小破站视频写的代码,却发现我的插入操作自动提交了(视频中需要手动提交);

猜测是myBatis中有设置为自动提交的方法,于是百度了一下,果然

myBatis中自动提交设置

openSession() 方法有带参数为 autoCommit 的布尔值,即是否自动提交可以手动控制的。

当openSession(true),即括号内为true的时候,mybaits是可以自动提交修改后的数据的

当openSession(),即括号内为空(或false),为手动提交,需要最后调用 session.commit() 来完成数据更新操作

查完之后又看了一遍源码,发现我写的确实是openSession();里面并未添加true;然后又看了几篇csdn上的攻略还是没能解决问题

真实原因

最后想是不是MySQL的引擎问题呢,一开始我觉得应该不是,因为创表的时候我特意改过表的引擎就是为了能进行事务操作,所以应该是没问题的

emmmmm........ 不应当(晕)

然后看了我当时写的源码:

ALTER TABLE salgrade ENGINE = InnoDb;

好吧,是我写错了(也不知道为啥这里我总写错,这个好像ALTER TABLE 这些要大写,反正之前写小写不对),用了代码提示里的表,表改错了(晕),下次直接Navicat吧还是

最终解决方案

 把t_student表的引擎改为InnoDB,就能解决问题了

MySQL的所有引擎中只有InnoDB支持事务,别的都会自动提交,所以如果需要实现事务功能,务必保证表的引擎为InnoDB哦

更改默认引擎

我百度了一下,说mysql-5.1版本之前默认引擎是MyISAM,之后是innoDB,但是我的默认却是MyISAM,不知道为啥(也有可能是我百度错了)

然后想着一劳永逸,直接把默认引擎改了得了,过程也不复杂;

在配置文件my.ini中的找到default-storage-engine,此时默认为MyISAM将等号后改为INNODB即可,当然这要先重启MySQL才能生效

<think>嗯,用户的问题是关于在MyBatis中实现事务未提交的示例写法。首先,我需要回顾一下MyBatis的事务管理机制。MyBatis本身提供了事务工厂,可以集成Spring的事务管理,或者使用自己的配置。用户可能想知道如何手动控制事务,比如在某个操作后不提交事务,以便进行后续处理或者回滚。 接下来,我需要考虑用户可能的实际应用场景。比如在测试过程中,可能需要保持事务不提交以查看中间状态,或者在某些业务逻辑中分步骤执行,但暂时不提交。不过通常事务应该尽快提交以保证数据一致性,未提交的事务可能会导致锁等问题,需要提醒用户注意。 然后,我需要查找MyBatis中如何手动控制事务。MyBatis的SqlSession通过commit和rollback方法来控制事务。如果用户没有手动提交,默认情况下自动提交可能开启或关闭,这取决于配置。比如,当使用openSession()时,默认不会自动提交,需要显式调用commit。 然后结合Spring的事务管理,通常使用@Transactional注解,但用户可能想在不使用Spring的情况下,直接通过MyBatis的API来控制。这时候需要示例代码展示如何获取SqlSession,执行操作,但不调用commit,这样事务就不会提交,数据库也不会持久化数据。 还需要考虑是否需要关闭SqlSession,如果不提交也不回滚,连接可能会被返回连接池,导致未提交的数据被其他事务看到,这取决于连接池的配置。所以示例中应该包括正确的资源管理,比如在finally块中关闭session,或者回滚。 然后,用户提供的引用中有提到MyBatis的连接池配置,以及Spring的事务管理相关的内容。需要确认用户是否在同时使用Spring,或者只是纯粹的MyBatis。示例应该分情况说明,比如原生MyBatis和集成Spring的情况。 在原生MyBatis示例中,可以通过SqlSessionFactory创建SqlSession,设置自动提交为false,执行操作后不调用commit,这样事务就不会提交。同时,需要关闭session,但如果不提交,事务可能会回滚,或者保持挂起状态,具体行为可能依赖于数据库和配置。 在集成Spring的情况下,使用编程式事务管理,通过TransactionTemplate或者PlatformTransactionManager来手动控制事务的提交和回滚。这时候可以启动事务,执行操作,但不调用commit,这样事务会处于未提交状态,直到超时或者回滚。 另外,需要提醒用户事务未提交的风险,比如数据库锁、连接资源占用等,以及在实际生产环境中谨慎使用这种情况。可能用户是在测试或者调试时需要这样的示例,所以需要给出正确的资源清理方法,避免连接泄漏。 最后,总结可能的示例写法,分两种情况:原生MyBatis和Spring集成,并附上注意事项,确保用户理解潜在的问题和正确的使用方法。</think>### MyBatis事务未提交的示例及实现原理 在MyBatis中,事务未提交的场景通常出现在手动管理事务时未显式调用提交操作。以下是两种典型实现方式: --- #### 1. 原生MyBatis手动事务控制示例 ```java SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); SqlSession session = sqlSessionFactory.openSession(false); // 关闭自动提交 try { UserMapper mapper = session.getMapper(UserMapper.class); mapper.insertUser(new User("test", 25)); // 执行插入操作 // 此处不调用session.commit() // 事务未提交,数据库不会持久化数据 } finally { session.close(); // 关闭连接时会自动回滚未提交的事务[^3] } ``` **关键点说明:** - 通过`openSession(false)`禁用自动提交 - 执行数据库操作后不调用`commit()` - 连接关闭时未提交事务会自动回滚[^3] --- #### 2. Spring集成场景示例 ```java @Autowired private PlatformTransactionManager transactionManager; public void uncommittedOperation() { TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { userMapper.updateBalance(userId, 100); // 更新操作 // 不调用transactionManager.commit(status) } catch (Exception e) { transactionManager.rollback(status); } // 事务未提交,最终由Spring根据配置决定处理方式 } ``` **实现原理:** - 使用`TransactionStatus`获取事务上下文 - 跳过提交操作使事务保持未提交状态 - Spring默认会回滚未提交的事务 --- ### 注意事项 1. 未提交事务可能导致: - 数据库行锁长期持有(产生锁等待) - 连接池资源耗尽 - 数据可见性问题(其他事务读取到未提交数据需设置`READ_UNCOMMITTED`隔离级别) 2. 典型应用场景: ```java // 测试用例中验证回滚逻辑 @Test void testRollback() { performUncommittedOperation(); assertNull(queryUncommittedData()); // 验证数据未持久化 } ``` 3. MyBatis配置建议: ```xml <!-- SqlMapConfig.xml --> <transactionManager type="JDBC"> <property name="autoCommit" value="false"/> <!-- 默认关闭自动提交[^1] --> </transactionManager> ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值