24-事物

什麼是事物呢?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

  • PROPAGATION_REQUIRED--支持當前事務,若是當前沒有事務,就新建一個事務。這是最多見的選擇。
  • PROPAGATION_SUPPORTS--支持當前事務,若是當前沒有事務,就以非事務方式執行。(若是當前有事物,我就用當前事物,若是當前沒有事物,就以非事物進行執行)
  • PROPAGATION_MANDATORY--支持當前事務,若是當前沒有事務,就拋出異常。 
  • PROPAGATION_REQUIRES_NEW--新建事務,若是當前存在事務,把當前事務掛起。 
  • PROPAGATION_NOT_SUPPORTED--以非事務方式執行操做,若是當前存在事務,就把當前事務掛起。 
  • PROPAGATION_NEVER--以非事務方式執行,若是當前存在事務,則拋出異常。

使用方式:

@Transactional(propagation=Propagation.REQUIRED)

@Transactional(propagation=Propagation.SUPPORTS)

 

事物注意事項:

1:事物開啓後必定要釋放

不釋放的會一直佔用內存的,會報錯的

解決:提交釋放,手動回滾

2:聲明式事物中不要使用try

    由於環繞通知是須要捕獲到異常才能判斷是否進入異常通知,假如你try了一下,哪些AOP的環繞通知就不會捕獲到異常,從而會提交成功

使用事物注意事項

使用事物時,必定要將異常拋出外部,否則AOP環繞通知獲取不到異常不可以回滾。

 

事物隔離性:http://www.javashuo.com/article/p-nhxvhjdf-s.html

相關文章
相關標籤/搜索