场景

前面实现SSM简单整合以及CRUD参照:

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/85161018

SSM中配置事务管理所需jar包:

https://download.csdn.net/download/badao_liumang_qizhi/10867618

Mysql的表必须是INNODB的引擎才支持

实现

导入jar包

将事务所需jar包放在项目lib目录下

修改service

给接口添加deleteAll方法以及addTwo()方法

package com.badao.service;import java.util.List;import com.badao.pojo.User;
import com.badao.util.Page;public interface UserService {List<User> selectAllUser();User selectUser(Integer id);void updateUser(User user);void deleteUser(int id);void addUser(User user);void addTwo();void deleteAll();//List<User> selectAllUser(Page page);//int total();}

修改serviceImpl

先删除所有User,然后再插入两个User,其中第二个User故意设置名字过长。

package com.badao.service.impl;import java.util.List;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;import com.badao.mapper.UserMapper;
import com.badao.pojo.User;
import com.badao.service.UserService;
import com.badao.util.Page;
@Service
public class UserServiceImpl implements UserService {@AutowiredUserMapper userMapper;public List<User> selectAllUser() {// TODO Auto-generated method stubreturn userMapper.selectAllUser();}
/* @Overridepublic List<User> selectAllUser(Page page) {// TODO Auto-generated method stubreturn userMapper.selectAllUser(page);}@Overridepublic int total() {// TODO Auto-generated method stubreturn userMapper.total();}*/@Overridepublic User selectUser(Integer id) {// TODO Auto-generated method stubreturn userMapper.selectUser(id);}@Overridepublic void updateUser(User user) {// TODO Auto-generated method stubuserMapper.updateUser(user);}@Overridepublic void deleteUser(int id) {// TODO Auto-generated method stubuserMapper.deleteUser(id);}@Overridepublic void addUser(User user) {// TODO Auto-generated method stubuserMapper.addUser(user);}@Override/*@Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception")*/public void addTwo() {// TODO Auto-generated method stubUser user1 = new User();user1.setName("张三");user1.setAge(22);userMapper.addUser(user1);//用户2故意设置名字长度过长User user2 = new User();user2.setName("嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿");user2.setAge(25);userMapper.addUser(user2);}@Overridepublic void deleteAll() {// TODO Auto-generated method stubList<User> userList = selectAllUser();for (User user : userList) {userMapper.deleteUser(user.getId());}}}

编写测试类

package com.badao.test;import java.util.List;import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.annotation.Rollback;
import org.springframework.test.context.ContextConfiguration;
import com.badao.mapper.UserMapper;
import com.badao.pojo.User;
import com.badao.service.UserService;
import com.badao.util.Page;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;//使用junit4时报错导这个包
@RunWith(SpringJUnit4ClassRunner.class)//使用junit4进行测试
@ContextConfiguration("classpath:applicationContext.xml")//加载配置文件
public class InsertTest {@Autowired//自动注入private UserMapper userMapper;@Autowired//自动注入private UserService userService;@Test//标明是测试方法@Rollback(false)  //标明使用完此方法后事务不回滚,true时为回滚public void testAdd() {for (int i = 0; i < 100; i++) {User user = new User();user.setName("user"+i);userMapper.addUser(user);}}@Test//标明是测试方法public void testAddTwo() {//删除全部没用数据userService.deleteAll();//执行插入两个useruserService.addTwo();}/*  @Testpublic void testTotal() {int total = userMapper.total();System.out.println(total);}@Testpublic void testList() {Page p = new Page();p.setStart(2);p.setCount(3);List<User> cs=userMapper.selectAllUser(p);for (User c : cs) {System.out.println(c.getName());}}*/
}

配置applicationContext.xml

进行事务配置,添加事务管理器和事务注解扫描器

<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean>

完整代码

<?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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:annotation-config /><context:component-scan base-package="com.badao.service" /><!--  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/ssmtest?characterEncoding=UTF-8</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>523627</value> </property>   </bean> --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 基本属性 url、user、password --><property name= "url"value="jdbc:mysql://localhost:3306/ssmtest?characterEncoding=UTF-8" /><property name="username" value="root" /><property name="password" value="523627" /><property name="driverClassName" value="com.mysql.jdbc.Driver" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="3" /><property name="minIdle" value="3" /><property name="maxActive" value="20" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="SELECT 1" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小 --><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /></bean><bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="typeAliasesPackage" value="com.badao.pojo" /><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:com/badao/mapper/*.xml"/><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使用下面的方式配置参数,一行配置一个 --><value></value></property></bean></array></property>  </bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.badao.mapper"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean></beans>

使用注解方式

为serviceImpl里的addTwo()方法加上事务注解

@Override@Transactional(propagation=Propagation.REQUIRED,rollbackForClassName="Exception")public void addTwo() {// TODO Auto-generated method stubUser user1 = new User();user1.setName("张三");user1.setAge(22);userMapper.addUser(user1);//用户2故意设置名字长度过长User user2 = new User();user2.setName("嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿嘿");user2.setAge(25);userMapper.addUser(user2);}

运行测试

运行测试类中的testAddTwo()方法

@Test//标明是测试方法public void testAddTwo() {//删除全部没用数据userService.deleteAll();//执行插入两个useruserService.addTwo();}

先将数据库中的数据删除干净,然后再执行插入两个User,

因为第二个user的名字过长,所以报异常,导致事务回滚,所以第一个user的插入会回滚,可以看到数据库中是一条数据都没有。

使用XML配置事务

注释掉上面注解的部分,包括serviceImpl中的方法上的注解,修改applicationContext.xml

<?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:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:jdbc="http://www.springframework.org/schema/jdbc"xmlns:context="http://www.springframework.org/schema/context"xmlns:mvc="http://www.springframework.org/schema/mvc"xsi:schemaLocation="http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd"><context:annotation-config /><context:component-scan base-package="com.badao.service" /><!--  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <property name="url"> <value>jdbc:mysql://localhost:3306/ssmtest?characterEncoding=UTF-8</value> </property> <property name="username"> <value>root</value> </property> <property name="password"> <value>523627</value> </property>   </bean> --><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"><!-- 基本属性 url、user、password --><property name= "url"value="jdbc:mysql://localhost:3306/ssmtest?characterEncoding=UTF-8" /><property name="username" value="root" /><property name="password" value="523627" /><property name="driverClassName" value="com.mysql.jdbc.Driver" /><!-- 配置初始化大小、最小、最大 --><property name="initialSize" value="3" /><property name="minIdle" value="3" /><property name="maxActive" value="20" /><!-- 配置获取连接等待超时的时间 --><property name="maxWait" value="60000" /><!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 --><property name="timeBetweenEvictionRunsMillis" value="60000" /><!-- 配置一个连接在池中最小生存的时间,单位是毫秒 --><property name="minEvictableIdleTimeMillis" value="300000" /><property name="validationQuery" value="SELECT 1" /><property name="testWhileIdle" value="true" /><property name="testOnBorrow" value="false" /><property name="testOnReturn" value="false" /><!-- 打开PSCache,并且指定每个连接上PSCache的大小 --><property name="poolPreparedStatements" value="true" /><property name="maxPoolPreparedStatementPerConnectionSize" value="20" /></bean><bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="typeAliasesPackage" value="com.badao.pojo" /><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:com/badao/mapper/*.xml"/><property name="plugins"><array><bean class="com.github.pagehelper.PageInterceptor"><property name="properties"><!--使用下面的方式配置参数,一行配置一个 --><value></value></property></bean></array></property>  </bean><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.badao.mapper"/></bean><!-- <tx:annotation-driven transaction-manager="transactionManager"/> --><bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource" /></bean><tx:advice id="txadvice" transaction-manager="transactionManager"><tx:attributes><tx:method name="add*" propagation="REQUIRED" rollback-for="Exception" /><tx:method name="del*" propagation="REQUIRED" rollback-for="Exception"/><tx:method name="edit*" propagation="REQUIRED" rollback-for="Exception" /><tx:method name="update*" propagation="REQUIRED" rollback-for="Exception"/><tx:method name="list*" propagation="REQUIRED" rollback-for="Exception"/></tx:attributes></tx:advice><aop:config><aop:pointcut id="serviceMethod" expression="execution(* com.badao.service.*.*(..))"/><aop:advisor pointcut-ref="serviceMethod" advice-ref="txadvice"/></aop:config>     </beans>

再次运行测试类

再执行上面的测试一样的效果。

源码下载

https://download.csdn.net/download/badao_liumang_qizhi/10867762

SSM中进行注解式和XML配置式事务管理相关推荐

  1. spring xml 配置transactionManager事务管理器踩的坑

    transaction-manager默认为transactionManager 我把DataSourceTransactionManager的bean的id写成了dataSourceTransact ...

  2. Spring xml配置式的拦截器

    传统的xml配置式使用拦截器拦截请求. 一.Web.xml配置 在Web.xml 配置Spring核心控制器DispatcherServlet接收所有请求. <servlet><se ...

  3. SSM框架笔记15:SSM框架西蒙购物网(XML配置方式)

      SSM框架西蒙购物网(XML配置方式) 功能需求: 1.只有注册用户成功登录之后才可查看商品类别,查看商品,选购商品,生成订单.查看订单. 2.只有管理员才有权限进行购物网后台管理(用户管理+类别 ...

  4. cdh的hive配置中,修改 添加 hive-site.xml 配置 hive 增加用户 role 更改权限

    dh的hive配置中,修改 添加 hive-site.xml 配置 CDH版本的hive-site.xml是通过CM配置生成的文件,每次启动,都会根据CM选项还原配置,因此,我们必须用CM界面,找到H ...

  5. spring配置mysql事务管理_Spring 数据库事务管理机制

    要点1 Spring事务管理方法编程式事务(TransactionTemplate.PlatformTransactionManager) 声明式事务(配置式.注解式) 2 Spring 注解 @Tr ...

  6. 解决在Spring整合Hibernate配置tx事务管理器出现错误的问题

    解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 参考文章: (1)解决在Spring整合Hibernate配置tx事务管理器出现错误的问题 (2)https://www.cn ...

  7. 用注解还是用xml 配置?

    常用注解:@Insert.@Select.@Update.@Delete.@Param.@Results.@Result 在MyBatis 的工程中,我们有两种配置SQL 的方式.一种是在Mapper ...

  8. SSM4==通过XML配置spring 事务,通过纯注解配置spring 事务

    mysql的事务管理,是指在有关系的表(比如有外键)之间实现ACID,比如表A的金额列的外键是表B的金额列,那么如果A的金额减了300,B的金额也要减少300.如果A减300成功了,B失败了,mysq ...

  9. 使用WebServlet注解和web.xml配置servlet映射路径的区别及注意事项

    配置servlet映射路径 一.使用web.xml配置url 二.使用servlet注解设置url 三.有关使用web.xml重写WebServlet注解 一.使用web.xml配置url 格式: & ...

最新文章

  1. 详解Silverlight Treeview的HierarchicalDataTemplate使用
  2. phpexcel_cell 获取表格样式_Java 操作Word表格——创建嵌套表格、添加/复制表格行或列、设置表格是否禁止跨页断行...
  3. linux 打包压缩工具
  4. PHP随机字符串生成器
  5. 京东广告联盟android,京东APP联盟SDKAndroid版接口说明文档1.0.PDF
  6. 依赖注入的两种方式并附上例子
  7. 5. Keras - CNN应用于手写数字识别
  8. axios的安装和使用
  9. iphone/ipad 横竖屏切换
  10. python中object是什么_python object是什么类型
  11. Linux Email服务搭建与应用
  12. 乐符识别matlab,基于DPP的自动音符切分识别研究
  13. 产品经理的核心竞争力
  14. 什么是正价元素和负价元素??
  15. 微信公众号开发-使用微信网页授权进行登录并加上过滤器判断是否已登录
  16. 胖哥和几个群友写了个好用的OAuth2授权服务器
  17. Android移动开发-AndroidStudio调试安装时出现“Error running app: Default Activity Not Found”报错的解决方案
  18. MySQL 存储引擎 (SphinxSE)安装详解
  19. 探索移动端音视频与GSYVideoPlayer之旅 | Agora Talk
  20. 3、tensorflow2.0 实现MTCNN、训练O_net网络,并进行测试图片

热门文章

  1. javascript 给php传值_2020年PHP面试题附答案(实战经验)
  2. springboot 的启动流程
  3. python产生fir滤波器_Python中使用FIR滤波器firwin后信号的相移
  4. qt windows通过usb获取手机电量_华为手机系统故障修复及系统升级
  5. 边工作边考研的计算机经验,边工作边考研的经验
  6. php cms 的模板修改,phpcms v9后台登陆模板修改方法和程序版本更新提示修改方法...
  7. java oracle rs.next_使用jsp连接oracle时,rs.next()值始终为false,表中存在数据
  8. putty颜色设置|securecrt颜色设置|windows命令行颜色设置
  9. python把桢写入txt_Java 字节码与字节码分析
  10. 企业服务器虚拟化方案文档,服务器虚拟化在企业中的应用