写着写着感觉还是得复习基础知识,面试时传播属性中的嵌套事物被问住了,没记起来,尴尬整理下
首先熟悉下数据库中的事物
事物
A(Atomic)原子性
简单理解事物是可能是多个活动的工作单元要么全部发生要么全部不发生
C(Consistent)一致性
事物完成后,系统必须保证所建模的业务处于一致的状态
I(Isolated)隔离性
事物允许多个用户操作,每个用户的操作不会与其他用户纠缠起来
D(Durable)持久化
一旦事物完成结果应保存起来,在系统崩溃中可以恢复回来
Spring中事物类型
(1)编程式事物,通过编程方式管理,保持灵活性,但难维护
(2)声明式事物,业务代码和事物分离只需注解和xml配置管理事物
spring中事物的声明
@Transactional
首先需要理解它的五个参数
value 和 transactionManager 属性
指定使用那个事务管理器 SpringBoot默认DataSourceTransactionManager
1.隔离级别
ISOLATION_DEFAULT | 使用底层默认 |
ISOLATION_READ_COMMITTED | 允许读取其他并行事物Commit的数据字段,可防止脏读 |
ISOLATION_READ_UNCOMMITTED | 允许事物读取其他并行事物还没送出去的数据会发生Dirty,Nonrepeatable,Phantom read |
ISOLATION_REPEATABLE_READ | 要求多次读取数据相同 |
ISOLATION_SERIALIZABLE | 串行化会锁住表格 |
2.传播行为proganation
业务方法在容器中运行 | 如果 存在父事物 | 如果 不存在父事物 |
REQUIRED | 在父事物中运行 | 自己新建一个事物 |
SUPPORTS | 在父事物中运行 | 正常执行 |
MANDATORY | 在父事物中运行 | 抛出异常 |
REQUIRES_NEW | 新建事物,将父事物挂起 | 自己新建事物 |
NOT_SUPPORTED | 如果存在方法调用将父事物挂起,调用结束恢复 | 不会开启事物 |
NEVER | 抛出 异常 | 正常执行 |
NESTED | 它的事物和父事物是相依的 它父事物 一起提交,父事物回滚它也回滚 | 自己新建 |
理解Nested的关键是savepoint。
3.只读,此时可以利用数据库的最佳优化动作
指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
4任务超时 搭配REQUIRED REQUIRED_NEW NESTED
timeout 默认-1 如果超过时长没有执行完自动回滚
5.回滚规则rollback_for no_rollback_for
可以指定多个回滚类型 默认的只有在RUNTIME异常和ERROR才会回滚
在Spring中声明事物 让我们复杂的事务处理得到解脱
比如处理获取连接,关闭连接,事务提交和回滚操作不需要在相关方法中处理大量的try catch finally
使用起来简单但是还有大量的配置规则
而且注意这里的异常只是指运行时异常
参考链接