TransactionManager#suspend()
またしても id:taedium さんとひがさんのやりとりから.昨年から taedium さんの日記はネタの宝庫でありがたい限りです.
# higayasuo 『(中略) 3.2.3は、仕様がおかしいと思うんですよ。Transactionを開始してないのに、suspendするって。(以下略)』If the thread is not associated with any transaction, a null object reference is returned; otherwise, a valid Transaction object is returned.
別に仕様がおかしいというほどではないような.
妥当でない状況で呼び出された場合の振る舞いとして,例外をスローするのではなく null
を返すようにと決められているだけですよね.例えば java.util.Collection#remove(Object)
でコレクションに要素がなくても例外がスローされないのとあまり変わらないのではないかと.
このような仕様になっている理由は利便性でしょう.S2Tx にはサポートがありませんが,EJB 的な NotSupportedInterceptor
を実装する場合...
public Object invoke(final MethodInvocation invocation) throws Throwable { final Transaction tx = suspend(); try { return invocation.proceed(); } finally { if (tx != null) { resume(tx); } } }
というように,ノーチェックで TransactionManager#suspend()
を呼び出しても大丈夫になります.まぁ,チェックしても大した手間ではありませんけど.実際 RequiresNewInterceptor
はチェックしてますしね.
個人的には,ここは仕様通り実装すべきではないかなぁと思います.