前面我們學(xué)習(xí)了Aop的注解驅(qū)動開發(fā)及相關(guān)源碼的解讀過程幕庐,從本節(jié)開始我們以同樣的套路來學(xué)習(xí)聲明式事務(wù)的注解開發(fā)及源碼分析過程
聲明式事務(wù)的環(huán)境搭建
- 1.在pom文件中導(dǎo)入相關(guān)的依賴
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.5.RELEASE</version>
</dependency>
- 需要配置我們的數(shù)據(jù)源信息久锥,事務(wù)管理器等
@Configuration
@ComponentScan(value = "com.cacmp.bean.tx")
@EnableTransactionManagement
public class TxConfig {
@Bean
public DataSource dataSource(){
ComboPooledDataSource dataSource = new ComboPooledDataSource();
dataSource.setUser("root");
dataSource.setPassword("admin");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/tx?serverTimezone=UTC");
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(){
return new JdbcTemplate(dataSource());
}
//配置我們的事務(wù)管理器
@Bean
public PlatformTransactionManager transactionManager(){
return new DataSourceTransactionManager(dataSource());
}
簡單的來說下上述我們主要的注解
@EnableTransactionManagement:表示開啟基于注解的事務(wù)管理功能
-
3.編寫一個方法來測試我們的事務(wù)
- 3.1. Dao的編寫
@Repository
public class UserDao {
@Autowired
private JdbcTemplate jdbcTemplate;
public void insert(){
String sql ="INSERT INTO tx_user (userName,age) VALUES(?,?)";
String userName = UUID.randomUUID().toString().substring(0,4);
jdbcTemplate.update(sql,userName,18);
}
- 3.2. service 的編寫
@Service
public class UserService {
@Resource
private UserDao userDao;
@Transactional
public void insert(){
userDao.insert();
System.out.println("插入成功....");
}
- 測試代碼
//聲明式事務(wù)的測試
@Test
public void testTx(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(TxConfig.class);
UserService bean = applicationContext.getBean(UserService.class);
bean.insert();
applicationContext.close();
}
5 .建立對應(yīng)的表在數(shù)據(jù)庫中
image.png
現(xiàn)在我們的表中是沒有數(shù)據(jù)的,我們看能否插入記錄在表中
image.png
我們插入了兩條記錄在表中异剥,接下來我們測試下當(dāng)我們插入出現(xiàn)異常時看能否進行事務(wù)回滾瑟由,首先來修改下我們的代碼:
@Service
public class UserService {
@Resource
private UserDao userDao;
@Transactional
public void insert(){
userDao.insert();
System.out.println("插入成功....");
int i = 10 / 0;
}
接著測試,如下圖是后臺的日志打印
image.png
從截圖顯示插入成功冤寿,同樣也報了異常歹苦,我們發(fā)現(xiàn)數(shù)據(jù)庫中沒有新的記錄插入,這說明我們自己的事務(wù)起作用了疚沐,下節(jié)我們來分析其原理