2017-05-01 8 views
0

私は、春のブート(1.4.1)と休止(5.0.1.最終)を使用しています。私は@TransactionalEventListenerハンドラの中からdbに書き込もうとすると、呼び出しは単に無視されることに気付きました。読み込み呼び出しは正常に動作します。 私がignoreと言うとき、私はdbに書き込みがなく、ログがないことを意味します。私もlog4jdbcを有効にし、ログは残っていないので、休止状態のセッションは作成されませんでした。これから私は、spring-bootのどこかでトランザクションイベントハンドラを特定し、書き込み呼び出しを無視すると考えます。TransactionalEventListenerで書き込みコール/トランザクションが削除されました

ここは例です。私は、接続して

@Transactional(propagation = Propagation.REQUIRES_NEW) 
saveUploadEntity 

新しいトランザクションに注釈を付けることによって、新しいトランザクションを強制場合

// This function is defined in a class marked with @Service 
@TransactionalEventListener 
open fun handleEnqueue(event: EnqueueEvent) { 
    // some code to obtain encodeJobId 
    this.uploadService.saveUploadEntity(uploadEntity, encodeJobId) 
} 

@Service 
@Transactional 
class UploadService { 
    //.....code 

    open fun saveUploadEntity(uploadEntity: UploadEntity, encodeJobId: String): UploadEntity { 
     // some code 
     return this.save(uploadEntity) 
    } 
} 

今行われ、すべてが正常に動作しています。

  1. 私は、この書き込みが削除されたとき、完全な沈黙が(再び成功読み込み)ログであることを好みません。既知のバグはありますか?

  2. ハンドラで新しいトランザクションを開始するにはどうすればいいですか?私がhandleEnqueueイベントでPropogation.Requires_newを実行すると、動作しません。

さらに、読み取り/書き込みを正常にログするlog4jdbcを有効にするには、次の設定が春です。

ありがとうございました

答えて

0

同じ問題が発生しました。この動作は、実際に(@TransactionalEventListenerのデフォルトTransactionPhase属性である)TransactionPhase.AFTER_COMMITによって参照されるTransactionSynchronization#afterCompletion(int型)のドキュメントに記載されています

トランザクションがコミットされていますすでにロールバックされていますが、トランザクショナルリソースは引き続きアクティブでアクセス可能である場合があります。結果として、この時点でトリガーされたデータアクセスコードは、依然として別のトランザクションで実行する必要があることを明示的に宣言していない限り、元のトランザクションに「参加」し、何らかのクリーンアップを実行することができます。したがって、ここから呼び出されるすべてのトランザクション操作にPROPAGATION_REQUIRES_NEWを使用します。

残念ながら、これはPropagation.REQUIRES_NEWを介して新しいトランザクションを強制する以外のオプションを残していないようです。問題は、transactionalEventListenersがトランザクション同期として実装され、したがってトランザクションにバインドされていることです。トランザクションが閉じられ、リソースがクリーンアップされると、リスナーもクリーンアップされます。イベントを保存し、close()が呼び出された後にパブリッシュするカスタマイズされたEntityManagerを使用する方法があります。

トランザクションのコミット前に実行される@TransactionalEventListenerで、TransactionPhase.BEFORE_COMMITを使用できることに注意してください。これにより、データベースに変更が書き込まれますが、リッスンしているトランザクションが実際にコミットされたのかロールバックされるのかがわかりません。

関連する問題