予備的理解@Transactionalコメント

  SSMでは多くの場合、ビジネスレイヤ@Transactionalコメント内のクラスやメソッドに見られるプロジェクトは、ちょうどこのコメントの役割は、トランザクション管理ですが、これは特定の属性、どのような場合にロールバックするには、実際にはそれほど明確ではないことを知っています。だから私はいくつかのオンラインビデオやブログ、Springのトランザクション管理の予備的な理解をお読みください。あなたはすぐに使用し、トランザクション管理を理解するために勉強したい場合はここでは、レコードの主要な概念のいくつかである、それが関連動画に推奨されます。私が見https://www.imooc.com/learn/478を

  まず、Springのトランザクション管理を理解するために、我々はまず、トランザクションでどのような問題が生じてしまうもののこれらの特性に準拠していないトランザクション特性を理解する必要があります。のみ、これらを理解することによって、あなたは、トランザクション管理をどうするかを理解するだろう。

    1.トランザクション:操作の論理セットに対する操作のセットすべてが成功するか、すべて失敗のどちらか。

    トランザクションの2特性

     (1)アトミック:トランザクションは、作業の不可分の単位、いずれかの提出後の取引の成功のすべての操作がある、またはすべてが失敗します。

     (2)一貫性:トランザクションは一貫してコミットされる前と後のデータの整合性を。

     (3)単離:互いに分離されるトランザクション間のトランザクション・データの複数の間の干渉を。

     (4)持続性:単一のトランザクションがコミットされ、データベースがその影響に対処するために失敗したとしても、データベースは永続的になります変更しました。

    3.トランザクションが上記の特性に準拠していない場合、ダーティリード、反復不能読み取りとファントムは問題を読んで表示されます

    (1)ダーティ読み取り:トランザクションは、データが別のトランザクションを上書き読み込むが、まだコミットしていません。これらのデータはロールバックされた場合は、最初のトランザクションは、データが無効になります読み込みます。

    (2)非反復リード:同じトランザクション内で、同じデータが繰り返し読み出され、結果が異なります。

    (3)魔法の読書:トランザクションでデータを読んだ後、いくつかの他のトランザクションレコードを挿入します。場合は、クエリを再度、最初のトランザクションは、元のレコードを見つけることができません。

  第二に、これらの基本的な概念を理解することは、提供春のトランザクション管理インターフェイスを理解するために行きます。

    1.PlatformTransactionManager:プラットフォームのトランザクションマネージャインターフェイス。スプリングJDBC DataSourceTransactionManagerまたはMyBatisのために提供されるようなバネは、異なる永続化フレームワークのための異なる実装を提供し、

      これは、HibernateにHibernateTransactionManagerを提供します。トランザクションマネージャは、トランザクションがコミットなど、トランザクションはロールバックされ、いくつかの特定のトランザクション操作を定義します。

    2.TransactionDefinition:トランザクション定義情報。そのようなトランザクション分離レベル、伝搬挙動、タイムアウトと読み取り専用として。

    (1)トランザクション分離レベル

      A)READ_UNCOMMITTED:別のトランザクションがデータの読み取りを変更しますが、コミットされていないことができます、ダーティリード、読書やまたとないファントム読み取りがあるだろう

      B)READ_COMMITTEDは:別のトランザクションがダーティリード防ぐためにコミットするが、非反復可能読み取りおよびファントム読み取りがあるだろう後に読んだことができます。

      C)REPEATABLE_READ:トランザクション自体がデータを変更しない限り、同じデータを読み取るには、同じです。ダーティリードと非反復可能読み取り防ぎ、ファントム読み込みが発生します。

      D)SERIALIZABLEこの分離レベルは、そのダーティ・リードを保証するために、ACID分離レベルに完全に準拠している、非反復読み取り、ファントム読み取り生じません。しかし、同じ読み出しトランザクションにデータが完全にシリアルに読み、その実装は非常に遅いです。

      E)DEAFULT:春は、デフォルトの分離レベルを使用します。すべてのレベルがREPEATABLE_READ、ORACLEデフォルトの分離レベルはREAD_COMMITTEDであるデフォルトの分離レベルのバックエンドデータベースは、MySQLのデフォルトを使用します。

    (2)伝播挙動を、複数のビジネス層のメソッド呼び出しの問題を解決するために

      A)PROPAGATION_REQUIRED:現在のトランザクションをサポートします。現在のトランザクションが存在する場合、現在のトランザクションに別のトランザクションを追加し、現在のトランザクションが存在しない場合は、新しいトランザクションを作成し、最初に含まれます。

      B)PROPAGATION_SUPPORTS:現在のトランザクションのサポートを。現在のトランザクションが存在しない場合は、非トランザクションの方法を実行します。

      C)PROPAGATION_MANADATORY:現在のトランザクションをサポートします。現在のトランザクションが存在しない場合は、例外がスローされます。

      D)PROPAGATION_REQUIRES_NEW:新しいトランザクションは、現在のトランザクションを一時停止し、そのトランザクションは、現在のトランザクションの完全な新しい実行です。

      E)PROPAGATION_NOT_SUPPORTS:非トランザクションの方法で実行。現在のトランザクション保留中の現在のトランザクションは、存在する場合。現在のトランザクションの実行が完了した後、実行する別の方法。

      F)PROPAGATION_NEVER:非トランザクションの方法で実行されています。現在のトランザクションがある場合は、例外がスローされます。

      G)PROPAGATION_NESTEDは:現在のトランザクションが存在する場合、第2のトランザクションは、現在のトランザクション内にネスト。

    (3)タイムアウト:-1デフォルト。タイムアウトトランザクションが完了していない設定した後、トランザクションはロールバックされます。

    (4)読み取り専用:デフォルトはfalse、トランザクションが読み取り専用トランザクションを指定します。trueに設定した場合、追加のトランザクションの存在は、削除、およびデータベースを変更する例外をスローし、ロールバックされます。

    3.TransactionStatus:トランザクションの具体的な動作状態。

  第三に、トランザクション管理を設定します

    1.プログラムによるトランザクション管理:トランザクションの管理方法でトランザクションマネージャを書き込むことによって、このようにコードのビジネス層は侵襲的であるが、ほとんど使用されません。

        transactionTemplate.execute(新しいTransactionCallbackWithoutResult(){ 
            @Overrideは
            ボイドdoInTransactionWithoutResult(TransactionStatus transactionStatus){保護
                accountDao.outMoney(アウト、お金);
                 int型I = 1/0 ;
                 お金、でaccountDao.inMoney();
             } 
        }) 

    

    2.宣言型トランザクション管理:

    (1)トランザクション管理を実装するためにプロキシを使用するトランザクション管理クラスの必要性が増加するとき、あなたはプロキシクラスは非常に面倒で追加し、各クラスのプロキシクラスを追加する必要があります。だから、これはほとんど使用されません。

    <! - 注入代理- > 
    < ID = "accountServiceProxy" クラス= "org.springframework.transaction.interceptor.TransactionProxyFactoryBean" > 
        <! - 注入目标对象- > 
        < プロパティ= "ターゲット" REF =」 declarativeAccountService」 /> 
        <! - 注入事物管理器- > 
        < プロパティ= "のTransactionManager" REF = "のTransactionManager"  /> 

        < プロパティ= "transactionAttributes" > 
            <小道具> 
                < 小道具キー= "転送" > PROPAGATION_REQUIRED、+ java.lang.ArithmeticException </ 小道具> 
            </ 小道具> 
        </ プロパティ> 
    </ >
    @Resource(名前= "accountServiceProxy" プライベート DeclarativeAccountService declarativeAccountService。

    

    (2)トランザクション管理を実装するためにAspectJを使用するには、通知と強化のセクションを設定する必要があります。トランザクション管理パッケージまたはクラスを必要とすることは非常に明確です。

    <! - 配置事务通知- > 
    < TX:アドバイスID = "txAdvice" トランザクション・マネージャー= "のTransactionManager" > 
        < TX:属性> 
            < TX:メソッド= "転送" 伝播= "REQUIRED" /> 
        </ TX:属性> 
    </ TX:アドバイス> 

    < AOP:設定> 
        <! - 配置切入点- > 
        < AOP:ポイントカットのid = "aspectJPoint" 表現= "実行(* imooc.spring.transaction.manage.service。AspectJAccountService + *(..))」。  /> 
        <! -配置切面- > 
        < AOP:顧問の助言-REF = "txAdvice" ポイントカット-REF = "aspectJPoint"  /> 
    </ AOP:設定>

    

    (3)管理ベースのトランザクション注釈:工程に必要なトランザクション・マネージャの1構成は、XMLで構成することができるだけでなく、注釈2付し@Transactionalクラスまたはメソッドにアノテーションを使用して構成することができます。

< TX:注釈駆動型トランザクション・マネージャ= "のTransactionManager"  />

 

 

  第四に、使用@Transactional注釈の注意点

    クラスとメソッド1.はしばらくの間、クラスや@Transactional注釈が付いたときに、胡上のトランザクション管理方式の性質上のプロパティは任意のクラスのメソッドをオーバーライドします、@Transactionalノートをマークすることができます。

    トランザクションの注釈@ 2.マークは、他の方法で与えられていない公共の途中に表示されている場合にのみ有効になりますが、その効果を取ることができません。

    3.デフォルトで、時に異常なしトランザクション(のRuntimeExceptionまたはサブクラス)と、エラーがスローされた場合、トランザクションはロールバックされ、例外が追加をロールバックしません。

      属性のラベルを追加する要件rollbackForトランザクション管理、すなわち@TransactionalのアリのP3Cコード仕様(rollbackFor = Exception.class)。

間違った場所が私を修正してください場合は、これらの概念のいくつかを読んだ後、ブログ記事とビデオ録画です。興味のある方は、関連するブログやビデオのリンクにアクセスすることができます次のとおりです。

https://www.cnblogs.com/xd502djj/p/10940627.html

https://www.imooc.com/learn/478

 

おすすめ

転載: www.cnblogs.com/yaqee/p/11297734.html