1.什么是事务
(1)事务是数据库操作最基本的单元,逻辑上的一组操作,要么都成功,如果有一个失败所有操作都失败
(2)典型场景:微信转账
小明转账100块给小光
小明少100块,小光多100块
2.事务的四个特性(ACID)
(1) 原子性 (要么都成功,一个失败所有操作全失败)
(2) 一致性 (小明和小光钱的总和不变,转账之前他们俩总和没有变转账之后他们俩的总和也没有变)
(3) 隔离性 (多事务操作同一条记录 它们之间不会产生影响的)
(4) 持久性(事务提交之后,表中数据真正发生了变化)
3.spring事务的两种方式
编程式事务:通过try catch方式捕捉异常作事务的回滚。
声明式事务:通过配置文件的方式或注解的方式
4.注解声明式事务管理器 @Transactional这个注解可以放在类上也可以放在方法上面
5.@Transactional的属性
(1)Propagation 事务的传播行为
REQUIRED :如果有事务在运行,当前的方法就在事务内运行,否则,就启动一个新的事务,并在自己的事务内运行
举例:方法A 如果当前没有事务则开启一个新的事务 方法A在新的事务中运行;
如果有方法B 在事务B中正运行 则方法A开启事物A并且调用方法B加入到事物A中
总结:事务B会受到事务A的影响。
REQUIRED_NEW:当前的方法必须启动新事物,并在它自己的事物内运行。如果有事物正在运行,应该将它挂起
举例:方法A 事物A ;方法B 事物B
方法A 开启事务A 调用 方法B,方法B开启事务B
事务A中包含事务B
但是他们互不影响 假如事务A执行的时候遇到了异常事务A会回滚,但是事务B将继续运行下去不会受到事务A的影响,事务B不会回滚
SUPPORTS:如果有事务在运行,当前的方法就在这个事务内运行,否则它可以不运行在事务中
举例:方法A 事务A 比如传播行为是REQUIRED ;方法B 事务B比如传播行为是SUPPORTS
方法B没有开启事务也是可以运行传播的
方法A 调用方法B时,方法B会加入到事务A中运行
(2)ioslation 事务的隔离级别
事务有特性称为隔离性,有这个特性的存在,多事务操作之间不会产生影响。
不考虑隔离性会产生 脏读、不可重复度、虚(幻)读 三个读的问题
脏读:一个未提交的事务读取到另一个未提交事务的数据
举例:小明开启事务A读取到 一条金额为5000的数据;
小光开启事务B也读取到 一条金额为5000的数据;
小光把5000改成了6000没有提交事务B,小明读取到小光修改的6000的数据,对6000的数据进行操作,这时小光把6000作了回滚又变成了5000 ,这个时候小明读到的数据就又变成了5000 那数据就不准确了
不可重复读:一个未提交的事务读取到另一个提交的事务修改数据
举例:小明 开启事务A 读到数据是5000
小光 开启事务B读到的数据也是5000
小光把5000改成6000 并提交了事务B,小明读到的数据变成了6000
小明开启的事务A并没有提交 理论上讲读取到的数据是5000,因为不可重复读的现象发生读取到了6000
这样如果每次读到的数据都不一样,数据就不准确了
虚读:一个未提交事务读取到另一个已提交事务添加数据
举例:小明 开启事务A ;小光开启事务B
小光添加数据提交事务B,小明读到了小光添加的数据
总结:脏读是一个致命问题,但是不可重复读的是一种现象
ioslation 事务的隔离级解决三读问题
READ UNCOMMITTED(读未提交) 脏读、不可重复读、幻读都不能解决
READ COMMITTED(读已提交) 解决脏读 没有解决 不可重复读、幻读
REPEATABLE READ(可重复读) 解决脏读、不可重复读 没有解决幻读
SERIALIZABLE(串行化) 脏读、不可重复读、幻读都可以解决
(3)timeout:超时时间
事务需要在一定时间内进行提交,如果不提交进行回滚
默认值时-1没有超时时间 若设置时间以秒为单位进行计算
(4) readOnly:是否只读
默认是false 表示可以读写的操作
为true时只能进行查
个人觉的这个属性没什么用,开启事务一般是针对往数据库写的操作
(5) rollbackFor:回滚
设置那些异常进行事务回滚
属性值是异常类名
(6)noRollbackFor:不回滚
设置出现哪些异常不进行事务回滚
属性值是异常类名