一,概述

1.1编程式事务控制

1)自己手动实现事务控制,就叫做编程式事务控制.

Jdbc代码:Connection.setAutoCommit(false);//设置手动控制事务

Hibernate代码:Session.beginTransaction();//开启一个事务

2)细粒度的事务控制:可以对指定的方法/指定方法的某几行代码添加事务控制.这种事务控制比较灵活,但开发起来比较繁琐,每次都要开启/提交/回滚.

1.2声明式事务控制

1)Spring提供了对事务的管理,这个就叫做声明式事务管理.

2)Spring提供了对事务控制的实现.开发者如果想使用Spring的声明式事务管理,只需要在配置文件中配置即可;不想使用时直接在配置文件中移除即可.Spring最大程度的实现了对事务控制的解耦.

3)Spring的声明式事务管理,核心实现就是基于AOP.

4)粗粒度的事务控制:只能给整个方法应用事务,不能对方法的某几行代码应用事务.(因为AOP拦截的是方法)

5)Spring声明式事务管理器类:

Jdbc-->DataSourceTransactionManager

Hibernate-->HibernateTransactionManager.

二,声明式事务管理

2.1准备工作

a)jar包准备:spring-core5个jar包,spring-aop4个jar包,spring-jdbc4个jar包.

2.2XML方式实现

a)Dept.java(setter和getter方法省略)

public class Dept {public Dept(){}private int deptId;private String deptName;
}

b)DeptDao.java

package com.bighuan.a_tx;import org.springframework.jdbc.core.JdbcTemplate;
/*** dao实现,使用Spring对JDBC支持的功能* @author bighuan**/
public class DeptDao {//容器注入JdbcTemplate对象private JdbcTemplate jdbcTemplate;public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}public void save(Dept dept){String sql="insert into t_dept(deptName) values(?)";jdbcTemplate.update(sql, dept.getDeptName());}
}

c)DeptService.java

package com.bighuan.a_tx;
/*** service层实现,调用dao* @author bighuan**/
public class DeptService {//容器注入DeptDao对象private DeptDao deptDao;public void setDeptDao(DeptDao deptDao) {this.deptDao = deptDao;}public void save(Dept dept){//第一次调用deptDao.save(dept);//int i=1/0; //出现异常,整个Service.save(..)执行成功的要回滚deptDao.save(dept);//第二次调用}
}

d)bean.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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 1,数据源对象:C3P0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hib_demo"></property><property name="user" value="root"></property><property name="password" value="abc"></property><property name="initialPoolSize" value="3"></property><property name="maxPoolSize" value="10"></property><property name="maxStatements" value="100"></property><property name="acquireIncrement" value="2"></property></bean><!--2,JdbcTemplate工具类实例 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 3,DeptDao实例 --><bean id="deptDao" class="com.bighuan.a_tx.DeptDao"><property name="jdbcTemplate" ref="jdbcTemplate"></property></bean><!-- 4,DeptService实例 --><bean id="deptService" class="com.bighuan.a_tx.DeptService"><property name="deptDao" ref="deptDao"></property></bean><!-- ****Spring声明式事务管理配置**** --><!-- 5.1配置事务管理器类 --><bean id="txManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 5.2配置事务增强(如何管理事务?) --><tx:advice id="txAdvice" transaction-manager="txManager"><tx:attributes><tx:method name="save*" read-only="false" /><tx:method name="*find*" read-only="true"/><tx:method name="*get*" read-only="true"/><tx:method name="*" read-only="false"/></tx:attributes></tx:advice><!-- 5.3AOP配置:拦截哪些方法(切入点表达式)+应用上面的事务增强配置 --><aop:config><aop:pointcut expression="execution(* com.bighuan.a_tx.DeptService.*(..))" id="pt"/><aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/></aop:config>
</beans>

e)测试:

public class App {private ApplicationContext ac=new ClassPathXmlApplicationContext("com/bighuan/a_tx/bean.xml");@Testpublic void testApp() throws Exception {Dept dept=new Dept();dept.setDeptName("test:开发部");DeptService service=(DeptService) ac.getBean("deptService");service.save(dept);}
}

第一次:将DeptService.java中的错误代码注释掉,执行测试代码,发现数据插入了两条数据.

第二次:不注释掉代码,执行测试代码,不能插入数据;如果不使用事务控制的话,只能插入一条数据.

2.3注解方式实现

a)DeptDao.java

@Repository
public class DeptDao {//容器注入JdbcTemplate对象@Resourceprivate JdbcTemplate jdbcTemplate;public void save(Dept dept){String sql="insert into t_dept(deptName) values(?)";jdbcTemplate.update(sql, dept.getDeptName());}
}

b)DeptService.java

@Service
public class DeptService {//容器注入DeptDao对象@Resourceprivate DeptDao deptDao;@Resourceprivate LogDao logDao;@Transactional(readOnly=false,//读写事务timeout=-1,//-1表示事务的超时时间不限制,最终由数据库底层来决定//noRollbackFor=ArithmeticException.class,//遇到数学异常不回滚propagation=Propagation.REQUIRED)public void save(Dept dept){logDao.insertLog();//第一次调用deptDao.save(dept);int i=1/0; //出现异常,整个Service.save(..)执行成功的要回滚deptDao.save(dept);//第二次调用}
}

c)LogDao.java

@Repository
public class LogDao {@Resourceprivate JdbcTemplate jdbcTemplate;@Transactional(propagation=Propagation.REQUIRED)//@Transactional(propagation=Propagation.REQUIRES_NEW)public void insertLog(){jdbcTemplate.update("insert into log_ values('往dept表插入数据...')");}
}

d)bean.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:p="http://www.springframework.org/schema/p"xmlns:context="http://www.springframework.org/schema/context"xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><!-- 1,数据源对象:C3P0连接池 --><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="com.mysql.jdbc.Driver"></property><property name="jdbcUrl" value="jdbc:mysql://localhost:3306/hib_demo"></property><property name="user" value="root"></property><property name="password" value="abc"></property><property name="initialPoolSize" value="3"></property><property name="maxPoolSize" value="10"></property><property name="maxStatements" value="100"></property><property name="acquireIncrement" value="2"></property></bean><!--2,JdbcTemplate工具类实例 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 3,事务管理器类 --><bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"><property name="dataSource" ref="dataSource"></property></bean><!-- 开启注解扫描 --><context:component-scan base-package="com.bighuan.b_anno"></context:component-scan><!-- 注解方式实现事务:指定注解方式实现事务 --><tx:annotation-driven transaction-manager="txManager"/>
</beans>

注解方式相对于XML方式就简单的多.注解方式一定要开启注解扫描及声明注解方式实现事务.

e)测试:

public class App {private ApplicationContext ac=new ClassPathXmlApplicationContext("com/bighuan/b_anno/bean.xml");@Testpublic void testApp() throws Exception {Dept dept=new Dept();dept.setDeptName("test:开发部");DeptService service=(DeptService) ac.getBean("deptService");service.save(dept);}
}

测试思路与上面一样.

f)propagation=Propagation.REQUIRED与propagation=Propagation.REQUIRES_NEW的区别

前者表示:如果当前运行的方法,已经存在事务, 就会加入当前的事务.
后者表示:指定当前的方法必须在事务的环境下执行;如果当前运行的方法,已经存在事务,事务会挂起; 会始终开启一个新的事务,执行完后;刚才挂起的事务才继续运行.

Spring之事务控制相关推荐

  1. 【Spring】事务控制API

    Spring事务控制需要明确 1. JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计==业务层==的事务处理解决方案. 2. Spring框架提供了一组事务控制的接口.在S ...

  2. spring中事务控制的一组API

    Spring事务控制我们要明确的 第一:JavaEE体系进行分层开发,事务处理位于业务层,Spring提供了分层设计业务层的事务处理解决方案. 第二:spring框架为我们提供了一组事务控制的接口.具 ...

  3. Spring AOP+事务控制

    为什么80%的码农都做不了架构师?>>>    AOP事务控制   applicationContext.xml配置文件 <!-- 开启AOP监听 只对当前配置文件有效 --& ...

  4. Spring的事务控制-基于注解的方式

    模拟转账操作,即Jone减少500,tom增加500 如果有疑问请访问spring事务控制-基于xml方式 1.创建数据表 2.创建Account实体类 public class Account {p ...

  5. 代理对象之spring注解事务控制或shiro注解权限控制的理解

    通过注解 代理的可以是service或者action等,当他们被调用时由代理对象生效,由框架控制 shiro Action方法注解权限控制 底层基于代理技术实现,为Action创建代理对象,由代理对象 ...

  6. Spring的事务控制-基于xml方式

    介绍:该程序模拟了转账操作,即Jone减少500元,tom增加500元 1.导入坐标 <dependency><groupId>junit</groupId>< ...

  7. 【spring】编程式事务控制

    结构: AccountServiceImpl package com.itheima.service.impl;import com.itheima.dao.IAccountDao; import c ...

  8. Spring-学习笔记10【Spring事务控制】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  9. Spring的编程式事务声明式事务 基于注解的声明式事务控制

    文章目录 Spring中编程式事务 基于XML的声明式事务控制 基于注解的声明式事务控制 Spring集成web环境 Spring中编程式事务 Spring的事务控制可以分为编程式事务控制和声明式事务 ...

  10. 【Spring】spring基于注解的声明式事务控制

    结构 domin package com.itheima.domain;import java.io.Serializable;public class Account implements Seri ...

最新文章

  1. 除 Java 外,还有哪些编程语言蹭了 JVM 的车票?
  2. linux 终端 画圆,16个圆桌面Linux用户必须要知道的Shell命令
  3. 工业用微型计算机(10)-指令系统(7)
  4. c#操作mysql 执行语句_c# 数据库编程(通过SqlCommand 执行DML语句)
  5. 常用的函数式接口_Consumer接口
  6. 有限元笔记04:二维实体单元
  7. SQL Server遍历表(临时表)
  8. JS新手入门自学笔记
  9. Java中子类对象赋值给父类变量
  10. Java常见面试题:常用 GC 调优策略有哪些?
  11. win7+nfs文件服务器,win7如何挂载nfs服务器
  12. 杰理之如果再开蓝牙一拖二的话。手机连接样机时,会出现,无法连接【篇】
  13. java 中国标准时间_JAVA 转Wed Oct 05 2016 00:00:00 GMT+0800 (中国标准时间)
  14. 让你的 Xcode8 继续使用插件
  15. 前端3D地球的实现方式
  16. 十八万字《python从零到精通教程》第二版,贴心保姆教你从零变大神,学不会找我
  17. 模糊数学(Fuzzy Mathematics)理论基础
  18. Windows 10 上使用 CMake GUI 编译 Krita 源代码并使用 MinGW 64 作为构建工具
  19. dodo:人脸识别方法个人见解(zz from prfans)
  20. 51单片机RS485远程双机多机温度采集主从机多节点蜂鸣器报警

热门文章

  1. 扎克伯格为女儿选的量子物理学童书 你看得懂不?
  2. 第四周任务:wordCountPro
  3. Citrix XenDesktop 4.0 Setup Wizard crash
  4. 中概股“回A”政策趋紧 霞客环保终止卖壳
  5. Quartz与Spring集成 Job如何自动注入Spring容器托管的对象
  6. 类、匿名类、静态、构造、单例
  7. js创建对象,用函数实现对象创建,并实现内函数共享
  8. 11.企业安全建设指南(金融行业安全架构与技术实践) --- 互联网应用安全
  9. 19.高性能MySQL --- 锁的调试
  10. 37. customer payment(1)