spring 聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了spring 聲明式事務(wù)實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(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 開(kāi)啟基于注解的事務(wù)管理功能;據(jù)源、數(shù)據(jù)庫(kù)驅(qū)動(dòng)、Spring-jdbc模塊
* * 2、配置數(shù)據(jù)源、JdbcTemplate(Spring提供的簡(jiǎn)化數(shù)據(jù)庫(kù)操作的工具)操作
* @EnableXXX
* 5、配置事務(wù)管理器來(lái)控制事務(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,如果事先沒(méi)有添加指定任何transactionmanger
* 最終會(huì)從容器中按照類(lèi)型獲取一個(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類(lèi)會(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-05
Java并發(fā)編程深入理解之Synchronized的使用及底層原理詳解 上
在并發(fā)編程中存在線程安全問(wèn)題,主要原因有:1.存在共享數(shù)據(jù) 2.多線程共同操作共享數(shù)據(jù)。關(guān)鍵字synchronized可以保證在同一時(shí)刻,只有一個(gè)線程可以執(zhí)行某個(gè)方法或某個(gè)代碼塊,同時(shí)synchronized可以保證一個(gè)線程的變化可見(jiàn)(可見(jiàn)性),即可以代替volatile2021-09-09
Java使用File類(lèi)遍歷目錄及文件實(shí)例代碼
本篇文章主要介紹了Java使用File類(lèi)遍歷目錄及文件實(shí)例代碼,詳細(xì)的介紹了File類(lèi)的使用,有興趣的可以了解一下。2017-04-04
java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下
這篇文章主要為大家介紹了java同步器AQS架構(gòu)AbstractQueuedSynchronizer原理解析下,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2022-03-03
Spring中的底層架構(gòu)核心概念類(lèi)型轉(zhuǎn)換器詳解
這篇文章主要介紹了Spring中的底層架構(gòu)核心概念類(lèi)型轉(zhuǎn)換器詳解,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-12-12
SpringBoot2.x配置HTTPS訪問(wèn)的過(guò)程
這篇文章主要介紹了SpringBoot2.x配置HTTPS訪問(wèn)的過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
Jmeter對(duì)響應(yīng)數(shù)據(jù)實(shí)現(xiàn)斷言代碼實(shí)例
這篇文章主要介紹了Jmeter對(duì)響應(yīng)數(shù)據(jù)實(shí)現(xiàn)斷言代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09

