blog

Spring5トランザクション

トランザクションは、データベース操作は、操作の論理的なセットは、1つの操作が失敗した場合、それらはすべて失敗します。 その結果、Zhang Sanのお金は増えますが、Li Siのお金は減りません。 ト...

Aug 1, 2020 · 3 min. read
シェア

I. トランザクションとは

トランザクションは、データベース操作、論理的な操作のセットで、1つの操作が失敗すると、すべての操作が失敗します。

トランザクションの4つの特徴

  • 原子性
  • 一貫性
  • 分離
  • 永続性

第二に

データベースにテーブルと2つのレコードを追加

create table account(
id varchar(32) primary key,
name varchar(32),
money int
);
insert into account values('1','tanakasan',500),('2','lisi','500');

対応するエンティティクラス、サービス、ダオクラスの作成

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class account {
 private String id;
 private String name;
 private int money;
}
@Service
public class AccountService {
 @Autowired
 private AccountDao accountDao;
 //李から張への送金
 public void transfer(){
 //100件以上
 accountDao.addMoney();
 //100未満
 accountDao.subMoney();
 }
}
@Repository
public class AccountDao {
 @Autowired
 private JdbcTemplate jdbcTemplate;
 //ZhangSanが100増加する。
 public void addMoney(){
 String sql="UPDATE ACCOUNT SET MONEY = ? WHERE NAME = ?";
 jdbcTemplate.update(sql,600,"tanakasan");
 }
 //LiSiは100減少する
 public void subMoney(){
 String sql="UPDATE ACCOUNT SET MONEY = ? WHERE NAME = ?";
 jdbcTemplate.update(sql,400,"lisi");
 }
}

サービスのメソッドを以下のように変更すると

public void transfer(){
 //100件以上
 accountDao.addMoney();
 int a = 1/0;
 //100未満
 accountDao.subMoney();
 }

Zhangsanにはより多くのお金が入りますが、Lisanにはお金が入りません。

Springのトランザクション管理

springトランザクションの説明

1.サービス層に追加されたトランザクション

2.Springのトランザクション管理操作

  • プログラムによるトランザクション管理
  • 宣言的トランザクション管理

宣言型トランザクションは注釈付きトランザクションとxmlトランザクションに分けられます。

注釈付きトランザクション

まず、設定ファイルのネームスペースに以下の 2 つの項目を追加します。

xmlns:tx="http://..//tx"
http://..// http://..///-.sd

次に、トランザクション・マネージャーを設定し、自動スキャンをオンにします。

<!-- トランザクション・マネージャーを開始する。>
 <tx:advice transaction-manager="dataSourceTransactionManager"></tx:advice>
<!--ノート自動スキャンを有効にする>
 <context:component-scan base-package="com.bin.spring5"></context:component-scan>

次に、servicel クラスのメソッドにアノテーションを追加するか、クラス内のすべてのメソッドでトランザクションが有効になっていることを示すためにクラスにアノテーションを追加します。

 @Transactional
 public void transfer(){
 //100件以上
 accountDao.addMoney();
 int a =1/0;
 //100未満
 accountDao.subMoney();
 }

宣言型トランザクションのパラメータ

主なパラメータは以下のとおりです。
  • propagation トランザクション伝播の振る舞い
  • ioslation 分離レベル
  • timeout タイムアウト
  • readOnly 読み取り専用かどうか
  • rollbackFor
  • noRollbackFor

トランザクション伝播の振る舞い: これは、メソッドがメソッド内にネストされたときにトランザクションがどのように処理されるかを指します。一般的に使用されるのは REQUERDHE、REQUERD_NEW です。

トランザクションの分離レベル: MySQL のトランザクション分離レベルと同じです。
  • Dirty read: コミットされていないデータを読み込みます。
  • Unrepeatable read: コミットされたトランザクションを読む
  • ファントムリード:コミットまでに追加されたデータをリード

タイムアウト: トランザクションは一定時間内にコミットされる必要があり、コミットされない場合はロールされます。

read-onlyかどうか: 単なるクエリかどうか、デフォルトはfalse。

rollback: どのような例外がロールバックされるか

do not rollback: ロールバックされない例外。

Read next

オペレーティングシステムのIOスケジューリング

IOスケジューリングを導入するにあたり、まず理解しておくべき基本的な概念があります。 マウス、キーボード、スキャナ、デジタルカメラなどの一般的なものは入力デバイスに属し、モニタ、プリンタ、レコーダなどは出力デバイスに属します。I/Oデバイスは、その性質により、...

Aug 1, 2020 · 9 min read