1。使用シナリオの例
@Transactionalがどのように使用されるかを理解する前に、まず @Transactionalが役立つかを知る必要があります。親指を立てましょう。たとえば、部門には多くのメンバーがいます。これら2つはそれぞれ部門のテーブルとメンバーテーブルに保存されます。特定の部門を削除するときは、対応するメンバーがデフォルトで削除されるとします。ただし、これは実行中に発生する可能性があります。最初に部門を削除してから、メンバーを削除します。ただし、部門はそれを削除することに成功しており、メンバーを削除するときに例外が発生しました。この時点で、メンバーの削除が失敗した場合、以前に削除された部門も削除をキャンセルすることを願っています。このシナリオは、@Transactionalのものを使用してロールバックできます。
2。例外を確認し、未確認の例外
チェックされた例外と未確認の例外の概念をみんなに知らせる理由は次のとおりです。
Springは宣言的なトランザクション処理を使用します。デフォルトでは、注釈付きデータベース操作方法で未チェックの例外が発生した場合、すべてのデータベース操作はロールバックになります。例外がチェックされた例外である場合、データベース操作はデフォルトで提出されます。
確認された例外:
プログラムでは予測可能ではありません。たとえば、無効なユーザー入力、ファイルは存在しません、ネットワークまたはデータベースリンクエラー。これらはすべて外部の理由であり、プログラムによって制御されていません。
コードで明示的に処理する必要があります。たとえば、トライキャッチブロック処理を試したり、スローの説明でコールスタックの前のレイヤーの例外をスローします。
java.lang.exception(java.lang.runtimeexceptionを除く)から継承。
未確認の例外:
エラーを示し、プログラムのロジックが間違っています。これは、IllegalargumentException、nullpointerexception、IllegalStateExceptionなど、RuntimeExceptionのサブクラスです。
処理のためにコードで未チェックの未確認の例外を明示的にキャッチする必要はありません。
java.lang.runtimeexception(およびjava.lang.runtimeexceptionがjava.lang.exceptionから継承)から継承されました。
以下の異常な構造図を見ると、それはより階層化されるかもしれません:
3。@Transactionalの使用の例
この例では、Eclipse+Mavenを使用しています。 Mavenは瓶としてのみ管理されており、理解できないMavenの類人猿の友人でさえ理解できます。
3.1。スプリング構成ファイル
TXネームスペースは、最初に次のように構成する必要があります。
@トランザクションベースのトランザクション管理を使用するには、春に次の構成が必要です。
<bean id = "apptransactionmanager"> <プロパティ名= "dataSource" ref = "dataSource" /> < /bean> <tx:annotation-driven proxy-target-class = "false" transaction-manager = "apptransactionmanager" />>
ブロガーのスプリング構成ファイル全体:
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:context = "http://www.springframework.org/schema/context" xmlns:tx = "http://www.springframework.org/schema/tx" xmlns:aop = " xsi:schemalocation = "http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/ap http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context-ddprin <! - jdbc構成ファイルの紹介 - > <bean id = "propertyconfigurer"> <プロパティ名= "locations"> <list> <value> classpath:Properties/*。プロパティ</value> <! - ここに追加し続ける場合は、続きます。プロパティ - > <! - プロパティの構成 - > <! - プロパティの構成 - > <! - <プロパティ名= "driverclassName" value = "com.mysql.jdbc.driver" /> <プロパティ名= "url"値= " value = "Christmas258@"/> < <value> $ {jdbc_username} </value> </property> <property name = "password"> <value> $ {jdbc_password} </value> </property> </bean> <bean id = "aptransactionmanager"> <property name = "datasource" ref "/> </</bean> </bean> </bean proxy-target-class = "false" transaction-manager = "apptransactionmanager" /> <! - xxxxmapper.xmlに対応するすべてのマッパーインターフェイスファイルを自動的にスキャンするため、Mpperマッピングを1つずつ手動で構成する必要はありません。マッパーインターフェイスクラスとマッパーマッピングファイルが互いに対応する限り。 - > <bean> <プロパティ名= "basepackage" value = "com.luo.dao" /> < /bean> <! - mybatisファイル、mapperlocations configure ** mapper.xmlファイルの場所、構成mybatis-configファイルの場所 - > <bean id = "sqlsessionfatefactory"> <"> <"> <"> <"> <beantory "datasurce" name = "mapperlocations" value = "classpath:mapper/*。xml"/> <プロパティname = "configlocation" value = "classpath:mybatis/mybatis-config.xml"/> <! - <プロパティname = "typealiasespackage" value = "com.tiantian.ckeditor.model" <コンテキスト:Component-Scanベースパッケージ= "com.luo.service" /> < /beans>3.2。 @transactionalを使用して、ユーザー実装クラスメソッドに注釈を追加します
@transactional(propagation = propagation.required)public void adduser(user user){userdao.adduser(user); string string = null; if(string.equals( "")){int i = 0; }}上記の方法では、意図的にnullポインターの例外を持っていて、物事がロールバックされました
3.3。ユニットテストクラスを実行します
@test public void addusertest(){user user = new user(); user.setUsername( "luoguohui1"); user.setuserpassword( "luoguohui1"); userservice.adduser(user);}挿入できないことがわかりましたが、@Transactionalが削除された場合、コードは次のとおりです。例外は発生しますが、データベースには対応するデータがまだ追加されています。
3.4。ソースコードのダウンロード
この記事の最終ソースコードをダウンロード:first_maven_project_jb51.rar
4。春の@transactionalを理解する必要があるという概念
春の@Transactionalは動的プロキシメカニズムに基づいており、開発で遭遇した問題を促進し、迅速に解決するための透明なトランザクション管理メカニズムを提供します。
一般的に、次のコードを介してメソッドまたはインターフェイスまたはクラスをコメントすることです。
@transactional(propagation = propagation.not_supported)
伝播は、7つの異なる伝播メカニズムをサポートしています。
必須:トランザクションが存在する場合、現在のトランザクションがサポートされています。トランザクションがない場合、新しいトランザクションが開始されます。
サポート:トランザクションが存在する場合、現在のトランザクションがサポートされます。トランザクションがない場合、非貿易の実行。ただし、トランザクション同期トランザクションマネージャーの場合、Propagation_Supportsはトランザクションを使用しないこととわずかに異なります。
not_supported:常に非貿易を実行し、既存のトランザクションを一時停止します。
必要:常に新しいトランザクションを開始します。トランザクションが既に存在する場合、既存のトランザクションは停止されます。
必須:トランザクションが既に存在する場合は、現在のトランザクションをサポートします。アクティブなトランザクションがない場合、例外がスローされます。
決して:アクティブなトランザクションが存在する場合、常に非貿易を実行します、例外がスローされます
ネスト:アクティブなトランザクションが存在する場合、ネストされたトランザクションで実行されます。アクティブなトランザクションがない場合は、必要なプロパティを押して実行します。
ここに注意すべきことがいくつかあります。それを読む必要があります。そうでなければ、さまざまな落とし穴に遭遇した場合、ブロガーはあなたに思い出させていません。
ここに注意すべきことがいくつかあります。それを読む必要があります。そうでなければ、さまざまな落とし穴に遭遇した場合、ブロガーはあなたに思い出させていません。
ここに注意すべきことがいくつかあります。それを読む必要があります。そうでなければ、さまざまな落とし穴に遭遇した場合、ブロガーはあなたに思い出させていません。
トランザクション管理が必要な場合は、@transactionalアノテーションを追加します。 @transactionalアノテーションは、インターフェイスの定義とインターフェイスメソッド、クラスの定義、クラスのパブリック方法に適用できます。
@transactionalアノテーションは、一般の可視性のある方法にのみ適用できます。保護された、プライベート、またはパッケージ可視メソッドで@Transactionalアノテーションを使用する場合、エラーは報告されませんが、この注釈付きメソッドは構成されたトランザクション設定を表示しません。
@Transactionalアノテーションの発生は、トランザクション動作を可能にするのに十分ではないことに注意してください。これは一種のメタデータです。構成要素を構成ファイルで使用して、トランザクション動作を真に有効にする必要があります。
インターフェイスベースのプロキシまたはクラスベースのプロキシが、要素の「プロキシターゲットクラス」属性値を介して作成されるかどうかを制御します。 「プロキシターゲットクラス」のジャンル値が「True」に設定されている場合、クラスベースのプロキシは機能します(これはCllib.jarに必要です。 「プロキシターゲットクラス」のジャンル値が「false」に設定されている場合、またはこのプロパティが省略されている場合、標準のJDKインターフェイスベースのプロキシが機能します。
Springチームは、クラスが実装したいインターフェイスではなく、特定のクラス(またはクラスの方法)で@transactionalアノテーションを使用することをお勧めします。インターフェイスで@TransactionAl Annotationを使用すると、インターフェイスベースのプロキシを設定した場合にのみ有効になります。注釈は継承できないため、クラスベースのプロキシが使用されている場合、トランザクション設定はクラスベースのプロキシによって認識されず、トランザクションプロキシによってオブジェクトがラップされないことを意味します。
@Transactionalのトランザクションが有効になっています。インターフェイスベースまたはクラスベースのプロキシが作成されます。したがって、同じクラスでは、1つのメソッドがトランザクションを使用して別のメソッドを呼び出すため、トランザクションは機能しません。
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。