事务操作的概念
什么是事务?
事务是数据库操作最基本单元,逻辑上的一组操作,要么都成功,如果有一个失败所有操作都失败
典型场景:银行转账
小明转账100给小虎
小明少100 小虎多一百
事务四个特性(ACID特性)
(1) 原子性
不可分割 一个失败所有都失败
(2) 一致性
操作之前和操作之后总量不变
(3) 隔离性
多事务操作他们之间不会产生影响
(4) 持久性
事务提交之后 对数据库的修改是永远的
搭建实务操作环境
1 创建数据库表,添加记录
2创建Service dao完成对象创建和注入属性
(1)service注入dao 在dao中注入jdbcTemplate 在jdbcRemplate注入DataSourse
3 再dao创建两个方法,多钱和少钱得方法,在service创建方法(转账得方法)
如果有异常 怎么解决?那么就用到了事务
事务操作过程
public void accountMoney(){ try { // 第一步 开启事务 // 第二步骤 进行业务操作 userDao.reduceMoney(); userDao.addMoney(); // 第三步 没有发生异常,提交事务 }catch (Exception e){ // 第四步 出现异常 事务回滚 } }
Spring事务管理介绍
1 事务添加到JavaEE三层接口里面Service层(业务逻辑层)
2 在spring进行事务管理操作
(1)有两种方式 编程式事务管理 和声明式事务管理
3 声明式事务管理
(1) 基于注解方式
(2)基于xml配置文件方式
4 在Spring进行声明式事务管理,底层使用AOP原理
5 Spring事务管理API
(1) 提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
注解声明式事务管理
1 在spring配置文件配置事务管理器
<!-- 创建事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!-- 注入数据源--> <property name="dataSource" ref="dataSource"></property> </bean>
2 在spring配置文件 开启事务注解
1 在spring配置文件引入名称空间tx
2 开启事务注解
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
3在service类上面或者类里面方法上面 添加事务注解
(1)@Transactional 这个注解添加到类上面,也可以添加到方法上面
(2)如果把这注解添加到类上面,这个类里面所有方法都添加事务
(3) 如果把这个注解添加到方法上面 为这个方法添加事务
你的业务方法需要什么样的事务?说明需要事务的类型
说明方法需要的事务
1 事务的隔离级别
事务的隔离级别是方法在高并发情况下对数据安全性的控制
2 事务的超时时间,表示一个方法最长的执行时间,如果方法执行超过了时间,事务就回滚
单位是秒 整数值 默认是-1
3 事务的传播行为 控制业务的方法是不是有事务的 是什么样的事务
7个传播行为 表示你的业务方法调用时,事务在方法之间是如何使用的
Spring提交事务,回滚事务的时机
1当你的业务方法执行成功 没有异常抛出 当方法执行完毕 spring在方法执行后提交事务
2当你的业务方法抛出运行时异常或error,spring执行回滚, 会调用事务管理器的rollback
运行是异常的定义:runtimeException 和其他的子类都是运行时异常
3放你的业务方法抛出的非运行时异常 只要是受查异常 提交事务
受查异常 在写代码中 必须处理的异常 例如IOException SQLException
@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED, timeout = -1, readOnly = false, rollbackFor = Exception.class)