1

春の取引管理を学んでいます。
Spring3.0 と oracle 10g を練習用に使用しました。
以下は私の春のトランザクション構成です

 <aop:config>
      <aop:pointcut expression="execution(* com.spring.*.service.impl.*.*(..))" 
                    id="serivcePointcut"/>
      <aop:advisor advice-ref="txAdvice" pointcut-ref="serivcePointcut"/>
</aop:config>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
     <tx:attributes>
         <tx:method name="get*" read-only="true"/>
         <tx:method name="find*" read-only="true"/>
         <tx:method name="*"/>
    </tx:attributes>
</tx:advice.

読み取り専用が true とマークされているため、get* メソッドを介してレコードを挿入すると例外がスローされるかどうかを確認したかったので、getCustomer() メソッドを介してレコードを挿入しました。しかし、例外をスローする代わりに、レコードが挿入されたと思います。

ログでは、com.spring.customer.service.impl.CustomerServiceImpl.Even に対して作成されているトランザクションを確認できます。ログには、Setting jdbc connection read only が表示されます。

誰が私が間違っているのか説明できますか?

4

1 に答える 1

0

TransactionDefinitionのjavadocには次のように書かれています。

これは、実際のトランザクションサブシステムのヒントとして機能します。必ずしも書き込みアクセスの試行が失敗するわけではありません。読み取り専用ヒントを解釈できないトランザクションマネージャーは、読み取り専用トランザクションを要求されたときに例外をスローしません。

そして、Connectionのjavadocは次のように述べています。

データベースの最適化を有効にするためのドライバーへのヒントとして、この接続を読み取り専用モードにします。

つまり、コードが実際に読み取り専用である場合、readOnlyを使用するとパフォーマンスが向上する可能性があります。しかし、それはあなたがそのようなトランザクションで書き込み操作を行うことを妨げることはありません。

于 2012-12-01T13:46:22.843 に答える