Spring 事务
2021-12-22 18:35:23 39 举报
AI智能生成
一图学会整个Spring事物
作者其他创作
大纲/内容
事务三要素
数据源:表示具体的事务性资源,是事务的真正处理者,如MySQL等。
事务管理器:像一个大管家,从整体上管理事务的处理过程,如打开、提交、回滚等
事务应用和属性配置:像一个标识符,表明哪些方法要参与事务,如何参与事务,以及一些相关属性如隔离级别、超时时间等
传播特性
REQUIRED
默认值,A如果有事务,B将使用该事务;如果A没有事务,B将创建一个新的事务。
REQUIRES_NEW
如果A有事务,将A的事务挂起,B创建一个新的事务;如果A没有事务,B创建一个新的事务。
NESTED
A和B底层采用保存点机制,形成嵌套事务。
SUPPORTS
A如果有事务,B将使用该事务;如果A没有事务,B将以非事务执行。
NOT_SUPPORTED
如果A有事务,将A的事务挂起,B将以非事务执行;如果A没有事务,B将以非事务执行。
MANDATORY
A如果有事务,B将使用该事务;如果A没有事务,B将抛异常。
NEVER
如果A有事务,B将抛异常;如果A没有事务,B将以非事务执行。
事务类型
物理事务
真实的数据库层面上打开的事务
逻辑事务
根据传播特性, 实际上由spring自己管理的逻辑上存在的事务
主要配置
数据源
如DruidDataSource作为一个@Bean注册到Spring容器中,配置好事务性资源
事务管理器
把一个@EnableTransactionManagement注解放到一个@Configuration类上,配置好事务管理器,并启用事务管理。
事务类/方法
把一个@Transactional注解放到类上或方法上,可以设置注解的属性,表明该方法按配置好的属性参与到事务中。
隔离问题
脏读(Dirty reads)
一个事务修改了一行数据但没有提交,第二个事务可以读取到这行被修改的数据,如果第一个事务回滚,第二个事务获取到的数据将是无效的。
不可重复读(Nonrepeatable read)
一个事务读取了一行数据,第二个事务修改了这行数据,第一个事务重新读取这行数据,将获得到不同的值。
幻读(Phantom read)
一个事务按一个where条件读取所有符合的数据行,第二个事务插入了一行数据且恰好也满足这个where条件,第一个事务再以这个where条件重新读取,将会获取额外多出来的这一行。
隔离级别
DEFAULT
使用底层数据存储的默认隔离级别。MySQL的默认隔离级别是REPEATABLE-READ。
READ_UNCOMMITTED
最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
READ_COMMITTED
允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
REPEATABLE_READ
对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生
SERIALIZABLE
最高的隔离级别,完全服从ACID的隔离级别,确保阻止脏读、不可重复读以及幻读,也是最慢的事务隔离级别,因为它通常是通过完全锁定事务相关的数据库表来实现的
核心类
PlatformTransactionManager
事务管理器
TransactionStatus
事务的一些基础信息,如超时时间、隔离级别、传播属性等
TransactionDefinition
事务的一些状态信息,如是否是一个新的事务、是否已被标记为回滚
事务风格
编程式事务
所谓编程式事务指的是通过编码方式实现事务,允许用户在代码中精确定义事务的边界。即类似于JDBC编程实现事务管理。管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务
管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
0 条评论
下一页