gpt4 book ai didi

mysql - 使用 JDBC 在 MyBatis 中回滚(无 Spring,无容器)

转载 作者:行者123 更新时间:2023-11-29 11:32:20 26 4
gpt4 key购买 nike

我看过各种有关使用 Spring 和 MyBatis 进行事务处理的帖子,但我面临着回滚问题,无法使用普通的旧式 JDBC。

我的(测试/一次性)代码非常简单:我打开一个 session ,插入一个记录,故意抛出一个错误并回滚事务。然而,它总是会提交。

public static void main (String[] args){
//-- omitted for brevity
try {
org.apache.ibatis.logging.LogFactory.useSlf4jLogging();
inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
sess = sqlSessionFactory.openSession(false);

BillsMapper mapper = sess.getMapper(BillsMapper.class);
BillState billState = new BillState();
billState.setBillId(-1);
billState.setLastName("TESTER");
billState.setFirstName("TESTER");
mapper.insert(billState);
logger.info("Post insert: key = {}", billState.getBillId());

if(1 == 1)
throw new RuntimeException("Error Thrown on purpose...testing rollback ");
sess.commit();
}catch(Exception e){
logger.error("Error: {}", e);
sess.rollback();
}finally{
sess.close();
logger.info("Finito!");
}
}

日志显示:

DEBUG | (BaseJdbcLogger.java:145) - ==>  Preparing: insert into bills (users_userId, refId, firstName, ...
DEBUG | (BaseJdbcLogger.java:145) - ==> Parameters: 67(Integer), 67-120530180328(String), TESTER(String), ...
DEBUG | (BaseJdbcLogger.java:145) - <== Updates: 1
INFO | (TestAction.java:50) - Post insert: key = 2478
ERROR | (TestAction.java:56) - Error: {} java.lang.RuntimeException: Error Thrown on purpose...testing rollback at com.s2stest.TestAction.main(TestAction.java:53)
DEBUG | (JdbcTransaction.java:79) - Rolling back JDBC Connection [com.mysql.jdbc.JDBC4Connection@371e88fb]
DEBUG | (JdbcTransaction.java:122) - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@371e88fb]
DEBUG | (JdbcTransaction.java:90) - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@371e88fb]
DEBUG | (PooledDataSource.java:344) - Returned connection 924748027 to pool.

请注意在关闭连接之前重置自动提交...在关闭 SqlSession 之前重置自动提交会导致我的回滚事务被提交吗?如果是这样,这是一个错误吗?有人用 JDBC 处理事务吗?我需要它来进行测试,并且我希望得到一些帮助。目前,任何事务都无法回滚。

我查看了MyBatis源码,它确实在关闭连接之前调用了resetAutocommit。如果有人找到了解决方法,我将使用 MySQL 5.6 和 mysql-connector-java-5.1.36.jar 作为驱动程序。

--- 更新 ---

mybatis-config.xml如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>
<settings>
<setting name="logImpl" value="SLF4J" />
</settings>
<typeAliases>
<package name="com.ship2storage.domain" />
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mytestDb?zeroDateTimeBehavior=convertToNull" />
<property name="username" value="--shhh!!--" />
<property name="password" value="--shhh!!--" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/ship2storage/db/maps/BillsMapper.xml" />
</mappers>

</configuration>

最佳答案

好的,我通过深入研究我的设置找到了答案。看来我为测试数据库安装的MySQL存储引擎是ISAM。 ISAM 支持事务。我使用以下 SQL 花絮切换到 InnoDB,并且事务现在可以使用 JDBC:

ALTER TABLE bills ENGINE=InnoDB;

我还没有尝试过这个,但看起来你也可以暂时这样做:

SET default_storage_engine=InnoDB;

希望这会对某人有所帮助。上面发布的代码/配置有效。

关于mysql - 使用 JDBC 在 MyBatis 中回滚(无 Spring,无容器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37201977/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com