SpringとMyBatisをトランザクションで使用することについてのあらゆる種類の記事を見てきましたが、通常のJDBCで動作しないロールバックの問題に直面しています。JDBCを使用したMyBatisでのロールバック(春、コンテナなし)
私の(テスト/投げ捨て)コードはかなりシンプルです:セッションを開いて、recを挿入し、目的のエラーをスローし、トランザクションをロールバックします。しかし、それは常にコミットします。
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 [[email protected]]
DEBUG | (JdbcTransaction.java:122) - Resetting autocommit to true on JDBC Connection [[email protected]]
DEBUG | (JdbcTransaction.java:90) - Closing JDBC Connection [[email protected]]
DEBUG | (PooledDataSource.java:344) - Returned connection 924748027 to pool.
注接続を閉じる前に自動コミットのリセットが.... SQLSESSIONを閉じる前にautcommitをリセットするだろう、私のロールバックされたトランザクションがコミットさせることが?もしそうなら、これはバグですか?誰かがトランザクションを処理するJDBCを手に入れましたか?私はテストのためにそれが必要で、私はいくつかの助けを評価したいと思います。現在、トランザクションはロールバックできません。
私はMyBatisのソースを見てきました。実際には、接続を閉じる前にresetAutocommitを呼び出しています。 MySQL 5.6とmysql-connector-java-5.1.36.jarを使用しています。
---次のように
MyBatisの-config.xmlには--- UPDATE:
<?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>
あなたの 'mybatis-config.xml'コードを投稿できますか? – Blank
@Reno投稿を更新しました。これを見ていただきありがとうございます。 – user991945