Spring註解 TX宣告式事務實現過程解析
阿新 • • 發佈:2020-04-07
環境搭建匯入
maven依賴
<!--spring提供的資料庫操作工具--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--c3p0 資料庫連線池--> <dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.5.5</version> </dependency> <!--mysql聯結器--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.48</version> </dependency>
配置資料庫相關資訊
@Configuration @ComponentScan("com.spring.tx") public class TxConfig { /** * 配置資料來源 */ @Bean public DataSource dataSource() throws PropertyVetoException { ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource(); comboPooledDataSource.setUser("root"); comboPooledDataSource.setPassword("root"); comboPooledDataSource.setDriverClass("com.mysql.jdbc.Driver"); comboPooledDataSource.setJdbcUrl("jdbc:mysql:///test"); return comboPooledDataSource; } @Bean public JdbcTemplate jdbcTemplate() throws PropertyVetoException { //Spring對配置類做了特殊處理,多次呼叫給容器中加元件的方法,其實是從容器中找元件,並不會重新新增 return new JdbcTemplate(dataSource()); } }
新增資料訪問層、業務層
@Repository public class UserDao { @Autowired private JdbcTemplate jdbcTemplate; public void saveUser(String name,Integer age) { String sql = "insert into user(name,age) values(?,?)"; jdbcTemplate.update(sql,name,age); } }
@Service public class UserService { @Autowired private UserDao userDao; public void saveUser(){ String name = "jack11"; Integer age = 19; userDao.saveUser(name,age); } }
新增測試類
public class TxTest { @Test public void test(){ ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class); UserService userService = (UserService) context.getBean("userService"); userService.saveUser(); } }
事務問題
此時基本環境已經搭建好了,點選執行,資料可以成功插入但是還沒有配置事務,沒有事務回滾會造成某些情況下資料出錯。在Spring註解中,可以在需要新增事務的方法或類上加@Transactional,並且開啟事務管理功能,即@EnableTransactionManagement,程式碼如下:
修改UserService 的 saveUser 方法
@Transactional public void saveUser(){ String name = "jack11"; Integer age = 19; userDao.saveUser(name,age); //模擬異常 int i = 1 / 0; }
在配置類加上@EnableTransactionManagement
@Configuration @ComponentScan("com.spring.tx") @EnableTransactionManagement public class TxConfig { //省略資料來源、jdbcTemplate的配置 }
再次執行測試方法,會發現報錯了,但不是我們模擬的異常報錯,控制檯提示找不到bean
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available
我們還需要註冊一個事務管理器來管理事務,PlatformTransactionManager有很多實現類,在Spring 中 JdbcTemplate、Mybatis應該使用 DataSourceTransactionManager
在配置類中再註冊一個元件,執行,事務生效
/** * 註冊事務管理器 */ @Bean public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException { return new DataSourceTransactionManager(dataSource()); }
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。