2016-05-13 83 views
0

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> 
+0

あなたの 'mybatis-config.xml'コードを投稿できますか? – Blank

+0

@Reno投稿を更新しました。これを見ていただきありがとうございます。 – user991945

答えて

1

OK、私は私のセットアップに深く掘って答えを見つけました。テスト用にインストールしたMySQLストレージエンジンはISAMだと思われます。 ISAM サポートトランザクションはありません。私は、次のSQLちらほらを使用してInnoDBテーブルに切り替え、および取引は今JDBCで動作:

ALTER TABLE bills ENGINE=InnoDB; 

私はこれを試していないが、しかし、あなたはあまりにも一時的にこれを行うことができますように見えます:

SET default_storage_engine=InnoDB; 

うまくいけば、これは誰かを助けるでしょう。上記のコード/設定が機能します。

関連する問題