深入理解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中事務的定義:
Propagation(key屬性確定代理應該給哪個方法增加事務行爲。這樣的屬性最重要的部份是傳播行爲。)有以下選項可供使用:
- PROPAGATION_REQUIRED--支持當前事務,如果當前方法沒有事務,就新建一個事務。這是最常見的選擇。
- PROPAGATION_SUPPORTS--支持當前事務,如果當前方法沒有事務,就以非事務方式執行。
- PROPAGATION_MANDATORY--支持當前事務,如果當前方法沒有事務,就拋出異常。
- PROPAGATION_REQUIRES_NEW--新建事務,如果當前方法存在事務,把當前事務掛起。
- PROPAGATION_NOT_SUPPORTED--以非事務方式執行操作,如果當前方法存在事務,就把當前事務掛起。
- PROPAGATION_NEVER--以非事務方式執行,如果當前方法存在事務,則拋出異常。
面高級經常會問到。
注:本博客純個人學習筆記,如有錯誤希望指出,謝謝。