Spring注解 TX聲明式事務(wù)實(shí)現(xiàn)過程解析
環(huán)境搭建導(dǎo)入
maven依賴
<!--spring提供的數(shù)據(jù)庫操作工具--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <!--c3p0 數(shù)據(jù)庫連接池--> <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>
配置數(shù)據(jù)庫相關(guān)信息
@Configuration @ComponentScan("com.spring.tx") public class TxConfig { /** * 配置數(shù)據(jù)源 */ @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對(duì)配置類做了特殊處理,多次調(diào)用給容器中加組件的方法,其實(shí)是從容器中找組件,并不會(huì)重新添加 return new JdbcTemplate(dataSource()); } }
添加數(shù)據(jù)訪問層、業(yè)務(wù)層
@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); } }
添加測(cè)試類
public class TxTest { @Test public void test(){ ApplicationContext context = new AnnotationConfigApplicationContext(TxConfig.class); UserService userService = (UserService) context.getBean("userService"); userService.saveUser(); } }
事務(wù)問題
此時(shí)基本環(huán)境已經(jīng)搭建好了,點(diǎn)擊運(yùn)行,數(shù)據(jù)可以成功插入但是還沒有配置事務(wù),沒有事務(wù)回滾會(huì)造成某些情況下數(shù)據(jù)出錯(cuò)。在Spring注解中,可以在需要添加事務(wù)的方法或類上加@Transactional,并且開啟事務(wù)管理功能,即@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 { //省略數(shù)據(jù)源、jdbcTemplate的配置 }
再次運(yùn)行測(cè)試方法,會(huì)發(fā)現(xiàn)報(bào)錯(cuò)了,但不是我們模擬的異常報(bào)錯(cuò),控制臺(tái)提示找不到bean
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.transaction.PlatformTransactionManager' available
我們還需要注冊(cè)一個(gè)事務(wù)管理器來管理事務(wù),PlatformTransactionManager有很多實(shí)現(xiàn)類,在Spring 中 JdbcTemplate、Mybatis應(yīng)該使用 DataSourceTransactionManager
在配置類中再注冊(cè)一個(gè)組件,運(yùn)行,事務(wù)生效
/** * 注冊(cè)事務(wù)管理器 */ @Bean public PlatformTransactionManager platformTransactionManager() throws PropertyVetoException { return new DataSourceTransactionManager(dataSource()); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
通過Java連接SQL?Server數(shù)據(jù)庫的超詳細(xì)操作流程
java相對(duì)于其他語言(例如c,c++等)連接數(shù)據(jù)庫要方便得多,那么如何連接呢?下面這篇文章主要給大家介紹了關(guān)于通過Java連接SQL?Server數(shù)據(jù)庫的超詳細(xì)操作流程,需要的朋友可以參考下2023-03-03Spring Boot前后端分離開發(fā)模式中的跨域問題及解決方法
本文介紹了解決Spring Boot前端Vue跨域問題的實(shí)戰(zhàn)經(jīng)驗(yàn),并提供了后端和前端的配置示例,通過配置后端和前端,我們可以輕松解決跨域問題,實(shí)現(xiàn)正常的前后端交互,需要的朋友可以參考下2023-09-09springboot利用aop實(shí)現(xiàn)接口異步(進(jìn)度條)的全過程
我們?cè)陂_發(fā)中,調(diào)用第三方接口時(shí),往往是提交數(shù)據(jù),要異步去獲取數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于springboot利用aop實(shí)現(xiàn)接口異步(進(jìn)度條)的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-01-01Java實(shí)現(xiàn)5種負(fù)載均衡算法(小結(jié))
負(fù)載均衡是將客戶端請(qǐng)求訪問,通過提前約定好的規(guī)則轉(zhuǎn)發(fā)給各個(gè)server,本文主要介紹了Java實(shí)現(xiàn)5種負(fù)載均衡算法,具有一定的參考價(jià)值,感興趣的可以了解一下2022-06-06