关键词:
什么是事务,很通俗的话来说就是,我们日常生活中总会出现在银行转账的业务,加入A向B转账100元,此时A的账户中应该减少100元,B的账户中增加100元,但是如果在A转完账B还没有接受的时候,服务器出现了故障,一般银行的系统都会给出交易失败的提示,并且A的账户中总金额也不会变,那么这就类似一个事务。
1.事务是单个逻辑单元工作单位执行的一系列操作
2.多个操作作为整体向系统提交,要么都执行,要么都不执行
3.事务时一个不可分割的逻辑单元
事务的4大特性:原子性、一致性、隔离性、持久性(ACID)
下边我就模拟一个银行转账的事务:
首先导入依赖
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-beans --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-beans</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-expression --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-expression</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!--以上4个是spring的核心--> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.aspectj/aspectjrt --> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjrt</artifactId> <version>1.9.2</version> </dependency> <!--以上两个是aop依赖--> <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc --> <!--spring自带的数据库连接依赖--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>5.1.0.RELEASE</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <!--mysql数据库依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.32</version> </dependency>
dao层接口
1 public interface AccountDao { 2 void addmonkey();//向表中增加金额 3 void submonkey();//向表中减少金额 4 }
dao层实现类
1 //dao层实现类需要继承JdbcDaoSupport,这是spring自带的数据库操作 2 public class AccountDaoImpl extends JdbcDaoSupport implements AccountDao { 3 @Override 4 public void addmonkey() { 5 //id为1的用户总金额增加100 6 String sql="update account set accountmonkey=accountmonkey+100 where accountid=1"; 7 this.getJdbcTemplate().update(sql); 8 } 9 10 @Override 11 public void submonkey() { 12 //id为2的用户总金额减少100 13 String sql="update account set accountmonkey=accountmonkey-100 where accountid=2"; 14 this.getJdbcTemplate().update(sql); 15 } 16 }
service层接口
public interface AccountService { void changeMonkey(); }
service实现类
public class AccountServiceImpl implements AccountService { private AccountDao dao; @Override public void changeMonkey() { dao.submonkey();//A先转账给B int result=5/0;//模拟异常,再调用完加钱的时候。 dao.addmonkey();//B接收money } public AccountDao getDao() { return dao; } public void setDao(AccountDao dao) { this.dao = dao; } }
实体类
1 public class Account { 2 private int accountid; 3 private String accountname; 4 private Double accountmonkey; 5 //省略set,get方法 6 }
增强类
//增强类 public class BeforeAdvice implements MethodBeforeAdvice, AfterReturningAdvice { @Override public void before(Method method, Object[] objects, Object o) throws Throwable { System.out.println("前置增强"); } @Override public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable { System.out.println("后置增强"); } }
测试类
1 public class Test { 2 public static void main(String[] args) { 3 ApplicationContext context = new ClassPathXmlApplicationContext("/applictionContext.xml"); 4 AccountService bean = context.getBean(AccountService.class); 5 bean.changeMonkey(); 6 } 7 }
核心配置文件applicationContext.xml
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.org/schema/tx" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:aop="http://www.springframework.org/schema/aop" 6 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/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> 7 <!--引入外部文件,将数据库配置文件引入到本文件中--> 8 <context:property-placeholder location="classpath:database.properties"/> 9 <!--dao层--> 10 <bean id="dao" class="dao.impl.AccountDaoImpl"> 11 <!--注入数据源--> 12 <property name="dataSource" ref="dataSource"/> 13 </bean> 14 <!--向容器中添加service层实现类--> 15 <bean id="service" class="service.impl.AccountServiceImpl"> 16 <property name="dao" ref="dao"/> 17 </bean> 18 <!--向容器中添加通知的实现类--> 19 <bean id="advice1" class="advice.BeforeAdvice"></bean> 20 <!--顾问包装通知--> 21 <bean id="advisor" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> 22 <property name="advice" ref="advice1"/> 23 <property name="mappedName" value="say"/> 24 </bean> 25 <!--顾问代理生成器--> 26 <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator"> 27 <property name="beanNames" value="service"/> 28 <property name="interceptorNames" value="advisor"/> 29 </bean> 30 <!--数据源,使用的数据源是spring自带的,讲道理这个自带的数据源不怎么好--> 31 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 32 <property name="username" value="${jdbc.username}"/> 33 <property name="password" value="${jdbc.password}"/> 34 <property name="url" value="${jdbc.url}"/> 35 <property name="driverClassName" value="${jdbc.driver}"/> 36 </bean> 37 <!--配置事务管理器--> 38 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 39 <property name="dataSource" ref="dataSource"/> 40 </bean> 41 <!--通知,tx标签是配置事务用的。propagation:事物的管理级别,isolation:事务的传播行为--> 42 <tx:advice transaction-manager="transactionManager" id="ad" > 43 <tx:attributes> 44 <tx:method name="changeMonkey" propagation="REQUIRED" isolation="READ_COMMITTED"/> 45 </tx:attributes> 46 </tx:advice> 47 <aop:config> 48 <aop:pointcut id="pointcut" expression="execution(* service.*.*(..))"/> 49 <aop:advisor advice-ref="ad" pointcut-ref="pointcut"/> 50 </aop:config> 51 </beans>
这里呢一个简单的事务就已经配置好了。
spring的task定时任务与事务(代码片段)
目录SpringTask定时任务xml方式1,加载Sring核心依赖(pom.xml配置)2,添加配置文件,添加IOC扫描器3,定义定时任务4,加载定时器下xml配置6,现象证明注解方式定时方法xml配置现象Cron表达式Spring事务事务的四大... 查看详情
spring的task定时任务与事务(代码片段)
目录SpringTask定时任务xml方式1,加载Sring核心依赖(pom.xml配置)2,添加配置文件,添加IOC扫描器3,定义定时任务4,加载定时器下xml配置6,现象证明注解方式定时方法xml配置现象Cron表达式Spring事务事务的四大... 查看详情
spring中事务的使用与配置(代码片段)
...置1.事务概念2.事务操作(模拟事务操作环境)3.事务管理(Spring事务管理)4.事务操作(注解声明式事务管理)5.事务操作(声明式事务管理参数配置)6.事务操作(XML声明式事务管理)7.事... 查看详情
mybatis与spring整合
Mybatis与Spring整合无外乎要将数据源,以及事物管理的相关配置交给spring来管理,mybatis配置负责sqlmapper的相关配置也就是dao层到sql映射的相关配置.一下以手机管理系统dao层实现所用到的Spring与MyBatis整合为例.1.spring中bea... 查看详情
spring事件-自定义事件
Spring系列教程Spring框架介绍Spring框架模块Spring开发环境搭建(Eclipse)创建一个简单的Spring应用Spring控制反转容器(InversionofControl–IOC)理解依赖注入(DI–DependencyInjection)BeanXML配置(1)-通过XML配置加载BeanBeanXML配置(2)-Bean作... 查看详情
spring框架学习spring管理事务方式之xml配置
1.DAOAccountDao.javapackagecn.mf.dao;publicinterfaceAccountDao{//加钱voidincreaseMoney(Integerid,Doublemoney);//减钱voiddecreaseMoney(Integerid,Doublemoney);}AccountDaoImpl.javapackagecn.mf.dao;importorg. 查看详情
spring读取xml配置文件的原理与实现
本篇博文的目录:一:前言二:spring的配置文件三:依赖的第三方库、使用技术、代码布局四:Document实现五:获取Element的实现六:解析Element元素七:Bean创造器八:Ioc容器的创建九:总结一:前言:Spring作为Bean的管理容器,在... 查看详情
spring基础(十六):spring事务管理注解方式和xml配置方式(代码片段)
文章目录Spring事务管理注解方式和XML配置方式一、Spring事务管理注解方式二、XML配置方式三、零XML的事务控制方式(了解)Spring事务管理注解方式和XML配置方式事务的管理应该放在我们的service层进行处理spring中有两种事... 查看详情
spring管理bean(xml与注解方式)(代码片段)
文章目录什么是Bean管理?Spring是如何管理Bean的?环境准备基于xml方式注入属性第一种注入方式:使用set方式进行注入。第二种注入方式:使用有参数的构造函数进行注入注解配置半注解式代码纯注解代码什么是Be... 查看详情
spring事件-自定义事件(代码片段)
Spring系列教程Spring框架介绍Spring框架模块Spring开发环境搭建(Eclipse)创建一个简单的Spring应用Spring控制反转容器(InversionofControl–IOC)理解依赖注入(DI–DependencyInjection)BeanXML配置(1)-通过XML配置加载BeanBeanXML配置(2)-Bean作... 查看详情
spring注解:反射与配置
上图运行结果按下图配置文件中的配置,进行的spring扫描加载在web项目中没有main方法,但web.xml可以配置tomcat,用tomcat加载spring,spring就会把配置加载进来 下面是自定义的注解 junit和spring结合 查看详情
spring初学之spring的事务管理xml
所有的java类都是用的上一篇文章:Spring初学之spring的事务管理不同的是,这时xml配置事务,所以就要把java类中的那些关于spring的注解都删掉,然后在xml中配置,ApplicationContext.xml如下:1<?xmlversion="1.0"encoding="UTF-8"?>2<beansxmln... 查看详情
spring在xml配置里配置事务
事先准备:配置数据源对象用<bean>实例化各个业务对象。1.配置事务管理器。<beanid="transactionManager"class="org.springframework.jdbc.datasourceManager"> <propertyname="datasource"ref="datasource"></property>&l 查看详情
具有 Spring Security 和 Java 配置的自定义身份验证管理器
】具有SpringSecurity和Java配置的自定义身份验证管理器【英文标题】:CustomAuthenticationManagerwithSpringSecurityandJavaConfiguration【发布时间】:2015-10-2720:36:36【问题描述】:我正在将SpringSecurity与SpringMVC一起使用来创建一个与现有应用程... 查看详情
spring事务管理,xml配置aop事务和注解配置aop事务
xml配置和注解配合共同代码AccountService.javapublicinterfaceAccountService{//转账方法voidtransfer(Integerfrom,Integerto,Doublemoney);}AccountServiceImpl.javaxml配置aop事务的AccountServiceImpl.javapublicclassAccountService 查看详情
spring配置事务xml
<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/sche 查看详情
spring的task定时任务与事务(代码片段)
目录SpringTask定时任务xml方式1,加载Sring核心依赖(pom.xml配置)2,添加配置文件,添加IOC扫描器3,定义定时任务4,加载定时器下xml配置6,现象证明注解方式定时方法xml配置现象Cron表达式Spring事务事务的四大... 查看详情
spring事务控制--基于xml的声明式事务控制:详细配置(代码片段)
01:Spring事务控制–编程式事务控制相关对象02:Spring事务控制–基于XML的声明式事务控制:环境搭建03:Spring事务控制–基于XML的声明式事务控制:详细配置04:Spring事务控制–基于注解的声明式事务控制1... 查看详情