spring 聲明式事務(wù)實(shí)現(xiàn)過程解析
這篇文章主要介紹了spring 聲明式事務(wù)實(shí)現(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
/** * 聲明式事務(wù): * * 環(huán)境搭建: * 1、導(dǎo)入相關(guān)依賴 * 數(shù)數(shù)據(jù) * 3、給方法上標(biāo)注 @Transactional 表示當(dāng)前方法是一個(gè)事務(wù)方法; * 4、 @EnableTransactionManagement 開啟基于注解的事務(wù)管理功能;據(jù)源、數(shù)據(jù)庫(kù)驅(qū)動(dòng)、Spring-jdbc模塊 * * 2、配置數(shù)據(jù)源、JdbcTemplate(Spring提供的簡(jiǎn)化數(shù)據(jù)庫(kù)操作的工具)操作 * @EnableXXX * 5、配置事務(wù)管理器來控制事務(wù); * @Bean * public PlatformTransactionManager transactionManager() * * * 原理: * 1)、@EnableTransactionManagement * 利用TransactionManagementConfigurationSelector給容器中會(huì)導(dǎo)入組件 * 導(dǎo)入兩個(gè)組件 * AutoProxyRegistrar * ProxyTransactionManagementConfiguration * 2)、AutoProxyRegistrar: * 給容器中注冊(cè)一個(gè) InfrastructureAdvisorAutoProxyCreator 組件; * InfrastructureAdvisorAutoProxyCreator:? * 利用后置處理器機(jī)制在對(duì)象創(chuàng)建以后,包裝對(duì)象,返回一個(gè)代理對(duì)象(增強(qiáng)器),代理對(duì)象執(zhí)行方法利用攔截器鏈進(jìn)行調(diào)用; * * 3)、ProxyTransactionManagementConfiguration 做了什么? * 1、給容器中注冊(cè)事務(wù)增強(qiáng)器; * 1)、事務(wù)增強(qiáng)器要用事務(wù)注解的信息,AnnotationTransactionAttributeSource解析事務(wù)注解 * 2)、事務(wù)攔截器: * TransactionInterceptor;保存了事務(wù)屬性信息,事務(wù)管理器; * 他是一個(gè) MethodInterceptor; * 在目標(biāo)方法執(zhí)行的時(shí)候; * 執(zhí)行攔截器鏈; * 事務(wù)攔截器: * 1)、先獲取事務(wù)相關(guān)的屬性 * 2)、再獲取PlatformTransactionManager,如果事先沒有添加指定任何transactionmanger * 最終會(huì)從容器中按照類型獲取一個(gè)PlatformTransactionManager; * 3)、執(zhí)行目標(biāo)方法 * 如果異常,獲取到事務(wù)管理器,利用事務(wù)管理回滾操作; * 如果正常,利用事務(wù)管理器,提交事務(wù) * */ @EnableTransactionManagement @ComponentScan("com.yuan.aop.tx") @Configuration public class TxConfig { //數(shù)據(jù)源 @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource dataSource=new ComboPooledDataSource(); dataSource.setUser("root"); dataSource.setPassword("123456"); dataSource.setDriverClass("com.mysql.cj.jdbc.Driver"); dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false"); return dataSource; } @Bean public JdbcTemplate jdbcTemplate() throws PropertyVetoException { //Spring對(duì)@Configuration類會(huì)特殊處理;給容器中加組件的方法,多次調(diào)用都只是從容器中找組件 JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource()); return jdbcTemplate; } //注冊(cè)事務(wù)管理器 @Bean public PlatformTransactionManager transactionManager() throws PropertyVetoException { return new DataSourceTransactionManager(dataSource()); } }
@Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; @Transactional public void insert() { String sql="INSERT INTO `tbl_user`(username,age) VALUES(?,?)"; String username= UUID.randomUUID().toString().substring(0,5); jdbcTemplate.update(sql,username,19); System.out.println("插入成功了"); int i=10/0; } }
@Service public class UserService { @Autowired private UserDao userDao; public void insertUser() { userDao.insert(); System.out.println("插入成功"); } }
public class App { public static void main(String[] args) { AnnotationConfigApplicationContext context=new AnnotationConfigApplicationContext(TxConfig.class); UserService service = context.getBean(UserService.class); service.insertUser(); context.close(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot使用filter獲取自定義請(qǐng)求頭的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot使用filter獲取自定義請(qǐng)求頭的實(shí)例代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-05-05Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上
在并發(fā)編程中存在線程安全問題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí)synchronized可以保證一個(gè)線程的變化可見(可見性),即可以代替volatile2021-09-09java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下
這篇文章主要為大家介紹了java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解
這篇文章主要介紹了Spring中的底層架構(gòu)核心概念類型轉(zhuǎn)換器詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12Jmeter對(duì)響應(yīng)數(shù)據(jù)實(shí)現(xiàn)斷言代碼實(shí)例
這篇文章主要介紹了Jmeter對(duì)響應(yīng)數(shù)據(jù)實(shí)現(xiàn)斷言代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09