JAva注記の@Transactional注記

3442 ワード

原文リンク【プログラマー内のポイント】:https://juejin.im/post/5e72e97c6fb9a07cb346083f
@Transactional注記
 メソッド内の複数のデータベース操作が同時に成功するか、同時に失敗するかを保証します.
事務面:主に2種類に分けられる
  1.プログラミングトランザクション
  2.宣言トランザクション 
1.手動指定:
try {
    //TODO something
     transactionManager.commit(status);
} catch (Exception e) {
    transactionManager.rollback(status);
    throw new InvoiceApplyException("    ");

2.宣言トランザクション:AOPに基づく面切り
(1)TXとAOPに基づくxmlプロファイル方式
(2)@Transactional注記に基づく
@Transactional
    @GetMapping("/test")
    public String test() {
    
        int insert = cityInfoDictMapper.insert(cityInfoDict);
    }

関連情報:
1、@Transactional注記はどのような場所で使用できますか?
@Transactionalはインタフェース、クラス、クラスメソッドで使用できます.
≪クラスに適用|Apply to Class|oem_src≫:クラスに@Transactional注記を配置すると、クラスのpublicメソッドがすべて同じトランザクション属性情報を構成していることを示します.
メソッドに作用:クラスが@Transactionalを構成し、メソッドも@Transactionalを構成すると、メソッドのトランザクションはクラスのトランザクション構成情報を上書きします.
インタフェースとして機能:Interfaceにマークアップされ、Spring AOPがCGLibダイナミックエージェントを使用するように構成されると、@Transactional注記が無効になるため、この使用方法は推奨されません.
@Transactional
@RestController
@RequestMapping
public class MybatisPlusController {
    @Autowired
    private CityInfoDictMapper cityInfoDictMapper;
    
    @Transactional(rollbackFor = Exception.class)
    @GetMapping("/test")
    public String test() throws Exception {
        CityInfoDict cityInfoDict = new CityInfoDict();
        cityInfoDict.setParentCityId(2);
        cityInfoDict.setCityName("2");
        cityInfoDict.setCityLevel("2");
        cityInfoDict.setCityCode("2");
        int insert = cityInfoDictMapper.insert(cityInfoDict);
        return insert + "";
    }
}

2、@Transactional注にはどのような属性がありますか?
牙列缺损
propagationはトランザクションの伝播動作を表し、デフォルト値はPropagation.REQUIRDであり、その他の属性情報は以下の通りである.
Propagation.REQUIRD:現在トランザクションが存在する場合はそのトランザクションに参加し、現在トランザクションが存在しない場合は新しいトランザクションを作成します.(つまり、AメソッドとBメソッドの両方に注釈が追加されている場合、デフォルトの伝播モードでは、Aメソッドの内部でBメソッドが呼び出され、2つのメソッドのトランザクションが1つのトランザクションにマージされます)
Propagation.SUPPORTS:現在トランザクションが存在する場合はそのトランザクションに参加し、現在トランザクションが存在しない場合は非トランザクションで続行します.
Propagation.MANDATORY:現在トランザクションが存在する場合はそのトランザクションに参加し、現在トランザクションが存在しない場合は例外を放出します.
Propagation.REQUIRES_NEW:新しいトランザクションを再作成し、現在トランザクションが存在する場合は現在のトランザクションを一時停止します.(クラスAのaメソッドがデフォルトのPropagation.REQUIRDモードを使用する場合、クラスBのbメソッドにPropagation.REQUIRES_NEWモードを採用し、aメソッドでbメソッドを呼び出してデータベースを操作するが、aメソッドが異常を投げ出した後、bメソッドはロールバックされない.Propagation.REQUIREWはaメソッドのトランザクションを一時停止するため)
Propagation.NOT_SUPPORTED:非トランザクションで実行し、現在トランザクションが存在する場合は、現在のトランザクションを一時停止します.
Propagation.NEVER:非トランザクションで実行され、現在トランザクションが存在する場合は例外が放出されます.
Propagation.NESTED:Propagation.REQUIRDと同じ効果です.
isolationプロパティ
isolation:トランザクションの独立性レベル.デフォルトはIsolation.DEFAULTです.
Isolation.DEFAULT:下位データベースのデフォルトの独立性レベルを使用します.
Isolation.READ_UNCOMMITTED
Isolation.READ_COMMITTED
Isolation.REPEATABLE_READ
Isolation.SERIALIZABLE
timeoutプロパティ
timeout:トランザクションのタイムアウト時間.デフォルトは-1です.この時間制限を超えてもトランザクションが完了していない場合は、トランザクションが自動的にロールバックされます.
readOnlyプロパティ
readOnly:トランザクションが読取り専用トランザクションであるかどうかを指定し、デフォルト値はfalseです.データの読み取りなど、トランザクションを必要としない方法を無視するには、read-onlyをtrueに設定します.
rollbackForプロパティ
rollbackFor:トランザクションロールバックをトリガーできる例外タイプを指定し、複数の例外タイプを指定できます.
noRollbackForプロパティ**
noRollbackFor:指定した例外タイプを投げ出し、トランザクションをロールバックせずに複数の例外タイプを指定できます.