Java Spring 聲明式事務(wù)詳解
項(xiàng)目結(jié)構(gòu):
表結(jié)構(gòu):
基于xml的聲明式事務(wù)配置
IAccountDao.java:
package tx.dao; import java.math.BigDecimal; public interface IAccountDao { void add(String name, BigDecimal money); void sub(String name, BigDecimal money); }
AccountDaoImpl.java:
package tx.service.impl; import tx.dao.IAccountDao; import tx.service.IAccountService; import java.math.BigDecimal; public class AccountServiceImpl implements IAccountService { private IAccountDao accountDao; public void setAccountDao(IAccountDao accountDao) { this.accountDao = accountDao; } @Override public void tran(String from, String to, BigDecimal money) { accountDao.sub(from, money); accountDao.add(to, money); } }
IAccountService.java:
package tx.service; import java.math.BigDecimal; public interface IAccountService { void tran(String from, String to, BigDecimal money); }
AccountDaoImpl.java:
package tx.dao.impl; import org.springframework.jdbc.core.JdbcTemplate; import tx.dao.IAccountDao; import java.math.BigDecimal; public class AccountDaoImpl implements IAccountDao { private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public void add(String name, BigDecimal money) { jdbcTemplate.update("update account set balance = balance + ? where name = ? ", money.toString(), name); } @Override public void sub(String name, BigDecimal money) { jdbcTemplate.update("update account set balance = balance - ? where name = ? ", money.toString(), name); } }
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd "> <!--配置數(shù)據(jù)源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="url" value="jdbc:mysql://localhost:3306/test?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="19834044876"/> <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"/> </bean> <!--創(chuàng)建事務(wù)管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--注入數(shù)據(jù)源--> <property name="dataSource" ref="dataSource"/> </bean> <!--配置jdbcTemplate對象--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <!--注入dataSource--> <property name="dataSource" ref="dataSource"/> </bean> <!--將JdbcTemplate注入到AccountDao中--> <bean id="accountDao" class="tx.dao.impl.AccountDaoImpl"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <!--將AccountDao注入到AccountService中--> <bean id="accountService" class="tx.service.impl.AccountServiceImpl"> <property name="accountDao" ref="accountDao"/> </bean> <!--配置事務(wù)通知--> <tx:advice id="txAdvice"> <!--配置事務(wù)參數(shù)--> <tx:attributes> <!--指定哪些方法上面添加事務(wù)--> <tx:method name="tran"/> <!-- name="*", name="tran*", name="*tran", ... --> </tx:attributes> </tx:advice> <!--配置切入點(diǎn)和切面--> <aop:config> <!--配置切入點(diǎn)--> <aop:pointcut id="pointCut" expression="execution(* tx.service.IAccountService.*(..))"/> <!--配置通知--> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointCut"/> </aop:config> </beans>
ApplicationContext context = new ClassPathXmlApplicationContext("tx.xml"); IAccountService accountService = context.getBean("accountService", IAccountService.class); accountService.tran("小明", "小紅", new BigDecimal(500));
完全注解(零xml)方式配置
IAccountDao.java:
package tx.dao; import java.math.BigDecimal; public interface IAccountDao { void add(String name, BigDecimal money); void sub(String name, BigDecimal money); }
AccountDaoImpl.java:
package tx.dao.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Repository; import tx.dao.IAccountDao; import java.math.BigDecimal; @Repository public class AccountDaoImpl implements IAccountDao { @Autowired private JdbcTemplate jdbcTemplate; @Override public void add(String name, BigDecimal money) { jdbcTemplate.update("update account set balance = balance + ? where name = ? ", money.toString(), name); } @Override public void sub(String name, BigDecimal money) { jdbcTemplate.update("update account set balance = balance - ? where name = ? ", money.toString(), name); } }
IAccountService.java:
package tx.service; import java.math.BigDecimal; public interface IAccountService { void tran(String from, String to, BigDecimal money); }
AccountServiceImpl.java:
package tx.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import tx.dao.IAccountDao; import tx.service.IAccountService; import java.math.BigDecimal; @Service @Transactional public class AccountServiceImpl implements IAccountService { @Autowired private IAccountDao accountDao; @Override public void tran(String from, String to, BigDecimal money) { accountDao.sub(from, money); accountDao.add(to, money); } }
TXConfig.java
package tx.config; import com.alibaba.druid.pool.DruidDataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; import tx.service.IAccountService; import tx.service.impl.AccountServiceImpl; import javax.sql.DataSource; @Configuration @ComponentScan(basePackages = "tx") @EnableTransactionManagement public class TXConfig { /** * 配置數(shù)據(jù)源 */ @Bean public DataSource getDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setUrl("jdbc:mysql://localhost:3306/test?useSSL=false"); dataSource.setUsername("root"); dataSource.setPassword("19834044876"); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); return dataSource; } /** * 創(chuàng)建事務(wù)管理器 */ @Bean public DataSourceTransactionManager getTransactionManager() { return new DataSourceTransactionManager(getDataSource()); } /** * 配置jdbcTemplate對象 */ @Bean public JdbcTemplate getJdbcTemplate() { return new JdbcTemplate(getDataSource()); } @Bean(name = "accountService") public IAccountService getAccountService() { return new AccountServiceImpl(); } }
ApplicationContext context = new AnnotationConfigApplicationContext(TXConfig.class); IAccountService accountService = context.getBean("accountService", IAccountService.class); accountService.tran("小明", "小紅", new BigDecimal(500));
事務(wù)參數(shù)
no-rollback-for
指定碰到哪些異常不需要回滾
rollback-for
指定碰到哪些異常需要回滾
read-only
設(shè)置事務(wù)為只讀事務(wù)
timeout
以秒為單位,設(shè)置事務(wù)超出指定時(shí)常后自動(dòng)回滾
默認(rèn)為-1,即不管事務(wù)運(yùn)行多久都不回滾
isolation
事務(wù)的隔離級別
默認(rèn)為DEFAULT,即使用當(dāng)前數(shù)據(jù)庫的隔離級別
propagation
事務(wù)的傳播行為
默認(rèn)為REQUIRED
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot中優(yōu)化Undertow性能的方法總結(jié)
Undertow是一個(gè)采用 Java 開發(fā)的靈活的高性能Web服務(wù)器,提供包括阻塞和基于NIO的非堵塞機(jī)制,本文將給大家介紹SpringBoot中優(yōu)化Undertow性能的方法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-08-08SpringBoot使用Filters實(shí)現(xiàn)請求過濾和預(yù)處理
過濾器(Filter)是一種在Web應(yīng)用中用于攔截和處理HTTP請求和響應(yīng)的對象,在Java Web開發(fā)中,過濾器是實(shí)現(xiàn)特定功能,如認(rèn)證、日志記錄和字符編碼處理的重要工具,本文主要介紹了SpringBoot使用Filters實(shí)現(xiàn)請求過濾和預(yù)處理,需要的朋友可以參考下2024-08-08java之swing實(shí)現(xiàn)復(fù)選框的方法
這篇文章主要介紹了java之swing實(shí)現(xiàn)復(fù)選框的方法,實(shí)例分析了java基于圖形界面復(fù)選框的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-09-09解決org.apache.ibatis.binding.BindingException:?Invalid?boun
這篇文章主要介紹了解決org.apache.ibatis.binding.BindingException:?Invalid?bound?statement?(not?found)問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05myBatis組件教程之緩存的實(shí)現(xiàn)與使用
這篇文章主要給大家介紹了關(guān)于myBatis組件教程之緩存的實(shí)現(xiàn)與使用的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-11-11Java執(zhí)行hadoop的基本操作實(shí)例代碼
這篇文章主要介紹了Java執(zhí)行hadoop的基本操作實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-04-04mybatisplus解除分頁限制的實(shí)現(xiàn)
這篇文章主要介紹了mybatisplus解除分頁限制的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12SpringBoot服務(wù)上實(shí)現(xiàn)接口限流的方法
這篇文章主要介紹了SpringBoot服務(wù)上實(shí)現(xiàn)接口限流的方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10