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 です。
- Dirty read: コミットされていないデータを読み込みます。
- Unrepeatable read: コミットされたトランザクションを読む
- ファントムリード:コミットまでに追加されたデータをリード
タイムアウト: トランザクションは一定時間内にコミットされる必要があり、コミットされない場合はロールされます。
read-onlyかどうか: 単なるクエリかどうか、デフォルトはfalse。
rollback: どのような例外がロールバックされるか
do not rollback: ロールバックされない例外。





