在springmvc的開發(fā)中,有個(gè)比較扯的東西,就是當(dāng)你在代碼中新開了一個(gè)線程,那么這個(gè)線程里面將不會(huì)有事物的存在.
1至于為何不會(huì)有事物的存在: 因?yàn)槲覀兊氖挛锒际怯衧pringmvc統(tǒng)一管理,而你新開了個(gè)線程,并沒有提交給springmvc進(jìn)行統(tǒng)一的管理.所以,如果沒有手動(dòng)申明,是不會(huì)有事物的存在的.
解決..
這樣就可以提供事物支持了..
DataSourceTransactionManager transactionManager = (DataSourceTransactionManager) ctx
.getBean("txManager");
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); //
事物隔離級(jí)別,開啟新事務(wù),這樣會(huì)比較安全些。
TransactionStatus status = transactionManager.getTransaction(def); //
獲得事務(wù)狀態(tài)
try {
//邏輯代碼,可以寫上你的邏輯處理代碼
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
}
ApplicationContext 不存在的情況下
@Autowired
private DataSourceTransactionManager txManager;
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);// 事物隔離級(jí)別,開啟新事務(wù)
TransactionStatus status = txManager.getTransaction(def); // 獲得事務(wù)狀態(tài)
try{
//邏輯代碼,可以寫上你的邏輯處理代碼
txManager.commit(status);
}catch(Exception e){
txManager.rollback(status);
}
在這里,其實(shí)還有另外一個(gè)坑
特別需要注意,如果這里開啟了事物.沒有提交,也沒有回滾,沒有關(guān)閉,
這個(gè)時(shí)候,服務(wù)器并不會(huì)拋出什么異常, 剛開始運(yùn)行也不會(huì)有什么錯(cuò)誤,一切運(yùn)行皆正常,
當(dāng)這個(gè)事物開啟到一定程度后,服務(wù)器就會(huì)像死了一樣,不處理其他的事物, 但是又沒有掛,
反正當(dāng)時(shí)很詭異,當(dāng)初我們找了好久,才想起就改了這個(gè)地方, 特意寫上這里,下次千萬注意!!
所以,當(dāng)開啟了事物后,一定要提交或者關(guān)閉,或者回滾.....