在數(shù)據(jù)層或業(yè)務(wù)層加一層保障,使得一系列對(duì)數(shù)據(jù)庫的操作同成功同失敗。
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),射陽企業(yè)網(wǎng)站建設(shè),射陽品牌網(wǎng)站建設(shè),網(wǎng)站定制,射陽網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,射陽網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。用法: 在業(yè)務(wù)層接口上添加Spring事務(wù)管理注解@Transactionalpublic interface AccountService { ? ?
@Transactional ? ?
public void transfer(String out,String in ,Double money);
}
一般不會(huì)添加到業(yè)務(wù)層實(shí)現(xiàn)類中,降低耦合。
除了添加到方法上,還可以添加到接口上表示當(dāng)前接口所有方法開啟事務(wù)。
開啟注解式事務(wù)驅(qū)動(dòng)注入事務(wù)管理器@Configuration @ComponentScan("com.itheima") @PropertySource("classpath:jdbc.properties") @Import({JdbcConfig.class,MybatisConfig.class})
@EnableTransactionManagement
public class SpringConfig {
}
這一步可以寫到Config類中
spring的設(shè)計(jì)@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager ptm = new DataSourceTransactionManager();
ptm.setDataSource(dataSource);
return ptm;
}
原本的操作數(shù)據(jù)庫的方法,每一個(gè)自己都會(huì)單獨(dú)開啟一個(gè)事務(wù),失敗會(huì)回滾自己的部分,但spring邏輯上使得所有操作都在一個(gè)事務(wù)里,同成功同失敗。
spring發(fā)起事務(wù)的方法叫做事務(wù)管理員,加入進(jìn)來的方法都叫事務(wù)協(xié)調(diào)員(可以是數(shù)據(jù)層還可以是業(yè)務(wù)層,都算,只是個(gè)邏輯角色)
@Transactional的屬性readOnly? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?設(shè)置是否為只讀事務(wù)?? ?readOnly=true 只讀事務(wù)
timeout? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)置事務(wù)超時(shí)時(shí)間?? ?timeout = -1(永不超時(shí))
rollbackFor? ? ? ? ? ? ? ? ? ? ? ? ? ? 設(shè)置事務(wù)回滾異常(class)?? ?rollbackFor = {NullPointException.class}
rollbackForClassName? ? ? ? ? 設(shè)置事務(wù)回滾異常(String)?? ?同上格式為字符串
noRollbackFor? ? ? ? ? ? ? ? ? ? ? ?設(shè)置事務(wù)不回滾異常(class)?? ?noRollbackFor = {NullPointException.class}
noRollbackForClassName?? ?設(shè)置事務(wù)不回滾異常(String)?? ?同上格式為字符串
propagation? ? ? ? ? ? ? ? ? ? ? ? ? ?設(shè)置事務(wù)傳播行為?? ?……
spring默認(rèn)只回滾error和運(yùn)行時(shí)異常,當(dāng)出現(xiàn)其他異常如:IO異常,這種時(shí)候要將其配置到注解屬性中,才會(huì)回滾。如:@Transactional(rollbackFor = IOException.class)
事務(wù)傳播行為:REQUIRED(默認(rèn))?? ?????????開啟T?? ?????????加入T
無?? ?新建T2
REQUIRES_NEW?? ?????????????開啟T?? ?????????新建一個(gè)T
無?? ?新建T2
SUPPORTS?? ??????????????????????開啟T? ? ? ? ? ? ?加入T
無?? ?無
NOT_SUPPORTED? ? ? ? ? ? ?開啟T? ? ? ? ? ? ?無
無?? ?無
MANDATORY? ? ? ? ? ? ? ? ? ? ? ?開啟T? ? ? ? ? ? 加入T
無?? ?ERROR
NEVER? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?開啟T? ? ? ? ? ? ERROR
無?? ?無
NESTED?? ???????????????????????????設(shè)置savePoint,一旦事務(wù)回滾,事務(wù)將回滾到savePoint處,交由客戶響應(yīng)提交/回滾
需求是不管代碼出不出問題,我們的日志必須記錄,考慮用finally,如果日志業(yè)務(wù)如果只加@Transactional的話,會(huì)和具體的業(yè)務(wù)邏輯納入到統(tǒng)一事務(wù)中,必須用REQUIRES_NEW,使得執(zhí)行時(shí)會(huì)新開一個(gè)自己的事務(wù)。
@Service
public class LogServiceImpl implements LogService { ? ?
@Autowired ? ?
private LogDao logDao; ? ?
@Transactional(propagation = Propagation.REQUIRES_NEW)? ?
public void log(String out,String in,Double money ) { ? ? ? ?
?????logDao.log("轉(zhuǎn)賬操作由"+out+"到"+in+",金額:"+money); ? ?
}
}
public void transfer(String out,String in ,Double money) { ? ?
try{ ? ? ? ?
?????accountDao.outMoney(out,money); ? ? ? ?
?????accountDao.inMoney(in,money); ? ?
}finally { ? ? ? ?
?????logService.log(out,in,money); ? ?
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧