事务是什么:
逻辑上的一组操作要么全部成功要么全部失败
事务的特性:
原子性:事务是不可分割的操作,把一组操作放在一个事务当中,要么全部成功要么全部失败!
一致性:执行前后保证数据的完整性是一致的!
隔离性:多个用户同时访问数据库要相互隔离!mysql默认的事务处理级别是'REPEATABLE-READ',也就是可重复读!
持久性: 事务一旦被提交,这条记录才会被真正的修改
PlatformTransactionManager :平台事务管理器,是Spring真正管理事务的对象,是一个接口,常用实现类有如下两个:
-
DataSourceTransactionManager :针对JDBC和mybatis事务管理
- HibernateTransactionManager :针对Hibernate事务管理
涉及到的两个接口:
TransactionDefinition它是事务的定义信息对象,里面有如下方法:
1)事务的隔离级别
2)事务的传播行为
传播行为解决的问题: 一个业务层事务 调用 另一个业务层事务时,事务之间关系如何处理
复杂的业务:调用两个业务层的复杂方法,业务层方法相互调用事务如何调用的!
1)将两个业务层的方法放到一个事务里面要么一块回滚要么一块失败! 再删除客户的业务层调用删除订单的业务方法,如果订单删除失败应该把删除客户一块回滚!
2)一个业务层调用一个业务层的方法一个不在一个事务中!一个回滚一个不用回滚! 在生成订单业务层调用发送信息的业务层,发送信息业务失败需要回滚但是下单业务不需要回滚
七种传播行为 三类:
1.保证在同一个事务内
(1)默认传播行为:propagation_required 支持当前事务如果存在就让两个操作在一个事务里面,如果没有事务创建一个事务让两个操作放在同一个事务中
(2)propagation_supports 支持当前事务,如果不存在,就不使用事务 使用查询的时候使用,没有增删改的方法的时候 (3)propagation_mandatory 支持当前事务,如果不存在,抛出异常 一般用不到
2.保证不再同一个事务中
(1)Propagation_requIres_new 当前事务存在当前事务挂起然后重新创建一个相当于两个事务 在生成订单业务层调用发送信息的业务层,发送信息业务失败需要回滚但是下单业务不需要回滚
(2)PROPAGATION_NOT_SUPPORTED 以非事务方式运行,如果有事务存在,挂起当前事务
(3)PROPAGATION_NEVER 以非事务方式运行,如果有事务存在,抛出异常
3. Propagation_nested 当前事务存在,嵌套事务执行 * 依赖于 JDBC3.0 提供 SavePoint 技术 ,回滚点, * 删除客户 删除订单, 在删除客户后, 设置SavePoint, 执行删除订单,删除订单和删除客户在同一个事务 ,删除部分订单失败, 事务回滚 SavePoint , 由用户控制是事务提交 还是 回滚
三个代表:
PROPAGATION_REQUIRED 一个事务, 要么都成功,要么都失败
PROPAGATION_REQUIRES_NEW 两个不同事务,彼此之间没有关系 一个事务失败了 不影响另一个事务
PROPAGATION_NESTED 一个事务, 在A事务 调用 B过程中, B失败了, 回滚事务到 之前SavePoint , 用户可以选择提交事务或者回滚事务
分布式事务
利用RabbitMQ保证数据的最终一致性! 比如说下单功能下单成功我们就立马返回给用户其他的业务发消息给其他功能去实现,如果其他业务出现异常我们就重试知道成功为止!
Spring @Transactional使用 具体详细使用方式链接
@Transactional属性
属性 | 类型 | 描述 |
---|---|---|
value | String | 可选的限定描述符,指定使用的事务管理器 |
propagation | enum: Propagation | 可选的事务传播行为设置 |
isolation | enum: Isolation | 可选的事务隔离级别设置 |
readOnly | boolean | 读写或只读事务,默认读写 |
timeout | int (in seconds granularity) | 事务超时时间设置 |
rollbackFor | Class对象数组,必须继承自Throwable | 导致事务回滚的异常类数组 |
rollbackForClassName | 类名数组,必须继承自Throwable | 导致事务回滚的异常类名字数组 |
noRollbackFor | Class对象数组,必须继承自Throwable | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 类名数组,必须继承自Throwable | 不会导致事务回滚的异常类名字数组 |