什麼是事物呢?html
要麼都成功要麼都失敗編程
事物又分2類spa
編程式事物代理
手動事物code
@Component public class TransactionUtils { // 事物管理器 @Autowired private DataSourceTransactionManager dataSourceTransactionManager; public TransactionStatus begin() { TransactionStatus transaction = dataSourceTransactionManager.getTransaction(new DefaultTransactionDefinition()); return transaction; } public void commit(TransactionStatus transaction) { dataSourceTransactionManager.commit(transaction); } public void rollback(TransactionStatus transaction) { dataSourceTransactionManager.rollback(transaction); } }
@Service public class UserService { @Autowired private UserDao userDao; @Autowired private TransactionUtils transactionUtils; public void add() { TransactionStatus begin; try{ begin = transactionUtils.begin(); userDao.add("lisi", 18); int i=1/0;//可能會發生異常 userDao.add("yushengjun", 19); }catch(Exception e){ transactionUtils.rollback(begin); } transactionUtils.commit(begin); } }
聲明式事物htm
聲明式事物實現原理:經過AOP的環繞通知和異常通知blog
事物的傳播七種行爲:事務
Spring中事務的定義:內存
Propagation(key屬性肯定代理應該給哪一個方法增長事務行爲。這樣的屬性最重要的部份是傳播行爲。)有如下選項可供使用:get
使用方式:
@Transactional(propagation=Propagation.REQUIRED)
@Transactional(propagation=Propagation.SUPPORTS)
事物注意事項:
1:事物開啓後必定要釋放
不釋放的會一直佔用內存的,會報錯的
解決:提交釋放,手動回滾
2:聲明式事物中不要使用try
由於環繞通知是須要捕獲到異常才能判斷是否進入異常通知,假如你try了一下,哪些AOP的環繞通知就不會捕獲到異常,從而會提交成功
使用事物時,必定要將異常拋出外部,否則AOP環繞通知獲取不到異常不可以回滾。