@Transactional

  1. javax.transaction.Transactional
  2. org.springframework.transaction.annotation.Transactional
    若是SpringBean則使用 2
    否則使用 1

---------------------------------------------------------------------------------------;

  • isolation – Spring 透過isolation 提供隔離;但是,在 javax 中,此功能只在特定情況使用。
  • Propagation – 可使用 Spring 中的 propagation 属性和 Java EE 中的 value 属性;
    Spring提供Propagation.SUPPORTS。
  • readOnly – Spring readOnly唯讀 。
  • timeout – Spring 超時設定。
  • Rollback – javax 提供了 rollbackOn 和 dontRollbackOn 属性,而 Spring 提供了 rollbackFor 和 noRollbackFor,
    以及兩個設定:rollbackForClassName 和 noRollbackForClassName。

-------------------------------------------------------------------------------------------;

  @Transactional(
    isolation = Isolation.READ_COMMITTED, 
    propagation = Propagation.SUPPORTS, 
    readOnly = false, 
    timeout = 30)

Isolation 分類

事務的隔離級別

  1. Isolation.READ_UNCOMMITTED 讀取未提交 缺點:髒讀
  2. Isolation.READ_COMMITTED 只能讀取已提交,解決髒讀 缺點:不可重複讀
  3. Isolation.REPEATABLE_READ 解決不可重複讀 ,缺點: 幻讀 (查詢與結果不一致)
  4. Isolation.SERIALIZABLE 所有的事務依次逐個執行,保證數據的一致性,缺點:性能低
  5. Isolation.DEFAULT 使用基礎數據存儲的默認隔離級別
    參考:https://blog.csdn.net/huangjun0210/article/details/84202333

Propagation 分類

transaction遇到transaction的行為

  1. TransactionDefinition.PROPAGATION_MANDATORY
  2. TransactionDefinition.PROPAGATION_NESTED
  3. TransactionDefinition.PROPAGATION_NEVER
  4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED
  5. TransactionDefinition.PROPAGATION_REQUIRED
  6. TransactionDefinition.PROPAGATION_REQUIRES_NEW
  7. TransactionDefinition.PROPAGATION_SUPPORTS
  8. TransactionDefinition.TIMEOUT_DEFAULT(Spring 不支援)

參考 :https://www.tpisoftware.com/tpu/articleDetails/2741


Spring AOP 代理

@Transactional 會有在同類別的內部調用method時失效問題


Optimistic Locking 與 Pessimistic locking

@Version
Optimistic Locking 可以使用來判斷

參考 : https://blog.mimacom.com/testing-optimistic-locking-handling-spring-boot-jpa/


DB 的 Transaction

ACID