事务
1. 事务概念
事务是数据库操作最基本单元,逻辑上是一组操作,要么成功,如果有一个失败所有的操作都失败
2. 事务的四个特性(ACID)
- 原子性 (要么都成功,要么都失败)
- 一致性 (操作之前操作之后,总量不变)
- 隔离性 (多事务之间进行操作,互相不影响)
- 持久性 (提交之后,数据发生变化)
3. 事务操作过程
-
开启事务
-
进行业务操作
-
没有异常,提交事务
-
出现异常,事务回滚
4.声明式事务管理
- 基于注解方式
- 基于xml方式
- 底层使用AOP原理
5. 基于注解方式操作步骤
-
在spring配置文件中配置事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManage"> <!-- 注入数据源--> <property name="dataSource" ref="dataSource"></property> </bean>
-
在spring配置文件,开启事务注解
-
在spring配置文件中引入命名空间 tx
-
开启事务注解
<tx:annotation-driven transaction-manage="transactionManager"></tx:annotation-driven>
-
-
在service类上面(或者类方法上面)添加事务注解
- @Transactional 这个注解添加到类上面,也可以添加到方法上面
- 添加到类上面,所有的方法都添加事务。
- 添加到方法上面,只有这个方法添加事务。
6.声明式事务管理参数配置
在service类上面添加注解@Tansactional,在这个注解里面可以配置参数
6.1 propagation
事务传播行为
-
多事务方法
-
事务方法: 对数据库数据进行变化的操作
-
Spring框架事务传播行为有7种
-
REQUIRED: 如果add方法本身有事务,调用其他方法,其他方法使用当前add方法里面的事务
如果add方法本身没有事务,调用其他方法,创建新事务
-
REQUIRED_NEW: 不管方法中是否有事务,创建新事务。
-
6.2 ioslation 事务隔离级别
-
事务有特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性会产生很多问题
-
三个问题: 脏读,不可重复读,虚读
-
脏读: 一个未提交的事务读取到另一个未提交事务的数据
- A B都要读取数据 B先开启事务,并对数据进行修改,A又读取数据,然而B还未提交,B回滚,数据恢复,A读取到的数据错误
-
不可重复读:一个未提交事务读取到另一个提交事务修改数据。
- A B都要读取数据,B先开启事务,读取数据,并对数据进行修改,提交。A后读取
-
虚读:一个未提交的事务读取到另一个已提交的事务增加的数据。
-
事务的隔离级别:
脏读 不可重复读 幻读 READ UNCOMMITTED(读未提交) 有 有 有 READ COMMITTED(读已提交) 无 有 有 REPEATABLE READ (可重复读) 无 无 有 SERIALIZABLE (串行化) 无 无 无
6.3 timeout 超时时间
- 事务需要在一定时间内进行提交,如果不提交进行回滚
- 默认值是 -1 设置时间以秒为单位计算
6.4 readonly 是否只读
- 读: 查询操作 写 添加修改删除操作
- readonly默认值是false 表示可以查询,可以添加修改删除操作
- 设置readonly值为true,设置成true之后,只能查询
6.5 rollbackFor 回滚
- 设置出现哪些异常进行事务回滚
6.6 noRollbackFor 不回滚
- 设置出现哪些异常不进行事务回滚