問題の説明
一部のインターフェースは異常で、一部のデータインターフェースは正常です。例外がスローされます:autoCommitが有効な場合はコミットできません。特定の例外はこれより長くなりますが、主な理由はデータベースの自動コミット構成に関連しています。
問題のある環境
springmvcプロジェクトは、データベース接続プールとしてAliのdruidを使用します
調査プロセス
ソースコードを通じて、spring-txトランザクションのDataSourceTransactionManagerが毎回次のコードを実行することがわかります。
if(con.getAutoCommit()){ txObject.setMustRestoreAutoCommit(true); if(logger.isDebugEnabled()){ logger.debug( "Switching JDBC Connection [" + con + "] to manual commit"); } con.setAutoCommit(false); }
つまり、Springは接続を取得するたびにAutoCommit = falseを設定しますが、ここでは明らかに効果がありません。なぜそれが有効にならなかったのか、疑わしいターゲットがデータソースに転送され、データソースがAliのドルイド接続プールを使用しているため、ドルイドバグであることが疑われます。以下は、ドルイド接続プールの同等の置き換えです。
接続プールを置き換える
接続プールをHikariCPに置き換えた後、HikariCPはautoCommit = falseの設定をサポートします。もう一度テストしたところ、問題は見つかりませんでした。Ali のdruid接続プールの問題であることが判明しました。
解決
1.データベースプロパティautocommit = falseを構成して解決する
データベースを設定しない場合は、次の方法を参照してください
2.接続プールを置き換えます。Aliのdruid接続プールは使用しないでください