深入理解Spring事務(初步)

深入理解Spring事務(初步)

一.什麼是事務,爲什麼要有事務?

保證數據的一致性。

事物的特性

原子性:不可分割。要麼執行要麼不執行,不能拆分類似於多線程同步。

一致性:數據一致。例:A有100,借給B20。總和80+20=100。

隔離性:互不影響我。

持久性:永久保存數據。

二.項目中是怎樣用事務的?

分類:

1.編程事務:手動開啓關閉事務;

2.聲明式事務:自動開啓關閉事務。xml方式和註解方式。

編程事務代碼如下:

xml配置:

@Component
public class TransactionManager {
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;


    public TransactionStatus begin() {
        // 獲取到事物狀態
        return dataSourceTransactionManager.getTransaction(new DefaultTransactionAttribute());
    }

     // 提交事務
    public void commit(TransactionStatus transactionStatus) {
        dataSourceTransactionManager.commit(transactionStatus); // 數據會提交到數據庫中...

    }

     // 回滾事務
    public void rollback(TransactionStatus transactionStatus) {
        dataSourceTransactionManager.rollback(transactionStatus);
    }
}

service:

    public void add() {
      TransactionStatus transactionStatus=transactionManager.begin();
      try {
         System.out.println("業務邏輯層");
         userDao.add("狒狒1",21);
         // int i=1/0;
         userDao.add("莫吊",21);
         transactionManager.commit(transactionStatus);
      }catch (Exception e){
         e.printStackTrace();
         if (transactionStatus!=null) {
            transactionManager.rollback(transactionStatus);
         }
      }


   }
}

dao:

public void add(String name, int age) {
    /**
     * @description:使用工具類操作數據庫
     * @param name,age
     * @return: void
     * @author: LiShun
     * @time: 2019/12/10 14:23
     */
    String sql = "INSERT INTO user(name,age) values(?,?);";
    int update = jdbcTemplate.update(sql, name, age);
    System.out.println("updateResult:" + update);
}

測試類:

如果不將int i=1/0註釋,會回滾事務,數據不會添加至數據庫。反之,添加成功。

註解方式實現:

修改xml:

修改service:

運行後會拋異常回滾事務,數據不會添加成功。需要將int i=1/0註釋,纔會添加數據成功。

三.傳播七種行爲。

Spring中事務的定義:

Propagationkey屬性確定代理應該給哪個方法增加事務行爲。這樣的屬性最重要的部份是傳播行爲。)有以下選項可供使用:

  • PROPAGATION_REQUIRED--支持當前事務,如果當前方法沒有事務,就新建一個事務。這是最常見的選擇。
  • PROPAGATION_SUPPORTS--支持當前事務,如果當前方法沒有事務,就以非事務方式執行。
  • PROPAGATION_MANDATORY--支持當前事務,如果當前方法沒有事務,就拋出異常。 
  • PROPAGATION_REQUIRES_NEW--新建事務,如果當前方法存在事務,把當前事務掛起。 
  • PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前方法存在事務,就把當前事務掛起。 
  • PROPAGATION_NEVER--以非事務方式執行,如果當前方法存在事務,則拋出異常。

  面高級經常會問到

注:本博客純個人學習筆記,如有錯誤希望指出,謝謝。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章