ホームページ Java &#&チュートリアル Java Springトランザクションロールバックの詳細説明

Java Springトランザクションロールバックの詳細説明

Jan 23, 2017 am 10:48 AM

Springトランザクションロールバック

1. 発生した問題

1つのメソッドで複数のデータベース保存操作を行うと、中間のデータベース操作でエラーが発生します。疑似コードは次のとおりです:

public method() {
  Dao1.save(Person1);
  Dao1.save(Person2);
 
  Dao1.save(Person2);//假如这句发生了错误,前面的两个对象会被保存到数据库中
  Dao1.save(Person2);
}
ログイン後にコピー

予想される状況: エラーが発生する前のすべてのデータベース保存操作はロールバックされ、保存されません

通常の状況: 前のデータベース操作が実行され、すべてのデータベース操作エラーが開始されますエラー発生以降はデータ保存に失敗します。これは私たちが望む結果ではないはずです。

この状況に遭遇した場合、Spring トランザクションを使用してこの問題を解決できます。

2. 例外の基本知識

1) 例外アーキテクチャ

例外の継承構造: Throwable は基本クラスであり、Error と Exception は Throwable を継承し、RuntimeException と IOException は Exception を継承します。 Error および RuntimeException とそのサブクラスは非チェック例外 (未チェック) になり、その他の例外はチェック例外 (チェックあり) になります。

Java Spring 事务回滚详解

2) エラー例外

エラーは、プログラムの実行中に非常に深刻で回復不可能なエラーが発生したことを示します。この場合、アプリケーションは、JAVA 仮想マシンのエラーなど、操作を終了することしかできません。 Error はチェックされていない例外であり、コンパイラは Error が処理されたかどうかをチェックしないため、プログラム内で Error タイプの例外をキャッチする必要はありません。通常の状況では、プログラム内で Error タイプの例外がスローされるべきではありません。

3) RuntimeException

Exception には、RuntimeException およびその他の非 RuntimeException 例外が含まれます。
RuntimeException は Unchecked Exception であり、プログラムが RuntimeException を処理するかどうかをコンパイラがチェックしないことを意味します。プログラム内で RuntimException 型の例外をキャッチする必要はなく、メソッド本体で RuntimeException クラスを宣言する必要もありません。 。 RuntimeException が発生した場合は、プログラム内でプログラミング エラーが発生したことを意味するため、RuntimeException をキャッチするのではなく、エラーを見つけてプログラムを変更する必要があります。

4) チェック済み例外

チェック済み例外。これはプログラミングで最もよく使用される例外でもあり、Exception から継承され、RuntimeException ではないすべての例外がチェック済み例外、IOException、および ClassNotFoundException です。 JAVA 言語では、チェックされた例外を処理する必要があると規定されており、コンパイラはこれをチェックし、メソッド本体でチェックされた例外を宣言するか、catch ステートメントを使用してチェックされた例外を処理用にキャプチャします。それ以外の場合は、コンパイルできません。

3. 例

ここで使用されるトランザクション構成は次のとおりです:

<!-- Jpa 事务配置 -->
 <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
   <property name="entityManagerFactory" ref="entityManagerFactory"/>
 </bean>
  
 <!-- 开启注解事务 -->
 <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
ログイン後にコピー

Spring 構成ファイルで、データ ソースのdefaultAutoCommit が True に設定されている場合、メソッドが例外をキャッチすると、トランザクションはたとえば、設定ファイルにそのようなレコードがある場合、このパラメータが設定されていないことがわかります。自動的に送信されますか? 答えは「いいえ」です。データベース接続プールとして com.alibaba.druid.pool.DruidDataSource を使用します。以下にソース コードを示します

状況 1: 例外がプログラムで手動でキャッチされない場合

<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
 
<property name="xxx" value="xxx"/>
 
<property name="xxx" value="xxx"/>
 
 ....
 <property name="defaultAutoCommit" value="true" />
 
</bean>
ログイン後にコピー
Java Spring 事务回滚详解 状況 2: 例外がプログラムでキャッチされた場合

@Transactional(rollbackOn = { Exception.class })
public void test() throws Exception {
   doDbStuff1();
   doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作  会回滚。
}
ログイン後にコピー


さて、例外を手動でキャッチする必要があり、また例外をキャッチしたい場合はどうなるでしょうか。例外がスローされたときにロールバックできますか?

トランザクションを手動でロールバックするには、次のように記述するだけです:

@Transactional(rollbackOn = { Exception.class })
public void test() {
   try {
    doDbStuff1();
    doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作 不会回滚。
   } catch (Exception e) {
      e.printStackTrace();  
   }
}
ログイン後にコピー

読んでいただきありがとうございます!ありがとう!

その他の Java Spring トランザクション ロールバック関連記事については、PHP 中国語 Web サイトに注目してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? 会社のセキュリティソフトウェアはアプリケーションの実行に失敗していますか?それをトラブルシューティングと解決する方法は? Apr 19, 2025 pm 04:51 PM

一部のアプリケーションが適切に機能しないようにする会社のセキュリティソフトウェアのトラブルシューティングとソリューション。多くの企業は、内部ネットワークセキュリティを確保するためにセキュリティソフトウェアを展開します。 ...

エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? エンティティクラス変数名をエレガントに取得して、データベースクエリ条件を構築する方法は? Apr 19, 2025 pm 11:42 PM

データベース操作にMyBatis-Plusまたはその他のORMフレームワークを使用する場合、エンティティクラスの属性名に基づいてクエリ条件を構築する必要があることがよくあります。あなたが毎回手動で...

MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? MapsTructを使用したシステムドッキングのフィールドマッピングの問題を簡素化する方法は? Apr 19, 2025 pm 06:21 PM

システムドッキングでのフィールドマッピング処理は、システムドッキングを実行する際に難しい問題に遭遇することがよくあります。システムのインターフェイスフィールドを効果的にマッピングする方法A ...

Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Intellijのアイデアは、ログを出力せずにSpring Bootプロジェクトのポート番号をどのように識別しますか? Apr 19, 2025 pm 11:45 PM

intellijideaultimatiateバージョンを使用してスプリングを開始します...

Javaオブジェクトを配列に安全に変換する方法は? Javaオブジェクトを配列に安全に変換する方法は? Apr 19, 2025 pm 11:33 PM

Javaオブジェクトと配列の変換:リスクの詳細な議論と鋳造タイプ変換の正しい方法多くのJava初心者は、オブジェクトのアレイへの変換に遭遇します...

データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? データベースクエリにTKMYBATISを使用するときに、エンティティクラスの変数名の構築クエリ条件をエレガントに取得する方法は? Apr 19, 2025 pm 09:51 PM

データベースクエリにTKMYBATISを使用する場合、クエリ条件を構築するためにエンティティクラスの変数名を優雅に取得する方法は一般的な問題です。この記事はピン留めします...

名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? 名前を数値に変換してソートを実装し、グループの一貫性を維持するにはどうすればよいですか? Apr 19, 2025 pm 11:30 PM

多くのアプリケーションシナリオでソートを実装するために名前を数値に変換するソリューションでは、ユーザーはグループ、特に1つでソートする必要がある場合があります...

eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? eコマースプラットフォームSKUおよびSPUデータベースデザイン:ユーザー定義の属性と原因のない製品の両方を考慮する方法は? Apr 19, 2025 pm 11:27 PM

eコマースプラットフォーム上のSKUおよびSPUテーブルの設計の詳細な説明この記事では、eコマースプラットフォームでのSKUとSPUのデータベース設計の問題、特にユーザー定義の販売を扱う方法について説明します。

See all articles