深化分析Mysql业务和Spring业务
看到上一篇同享的博客仍是在一年前,太久没进行同享感觉少了点东西,所以现在给自己定一个政策便是从八月份初步每个月至少同享两篇技能博客,沉积太久了,都忘掉初步为啥要看源码,为啥要深化学习技能了。回归正题,本文同享一些关于Mysql怎样处理多业务并发的问题和Spring源码是怎样操控业务以及一些业务失效的场景。
同享内容
- Mysql业务阻隔机制
- 锁机制
- MVCC多版别并发操控MySQL阻隔机制
- Spring业务运用和源码分析
- 业务失效问题
一appear、Mysql业务
数据库的多业务并发问题,为了处理多业务并发问题,数据库规划了业务阻隔机制、锁机制、MVCC多版别并发操控阻隔机制,用一整套机制来处理多业务并发问题。
1.1业务的特征
业务(Transaction)是数据库体系中一系列操作的一个逻辑单元,全部操作要么全部成功要么全部失利。
业务是差异文件存储体系与Nosql数据库重要特性之一,其存在的意义是为了确保即便在并发状况下也能正确的实施crud操作。怎样才算是spring正确的呢?这时提出了业务需求确保的四个特性即ACID:
- 原子性(Atomicityspring_结构) :业务是一个原子操作MySQL单元,其对数据的修改,要么全都实施,要么全都不实施。
- 一同性(Consistent) :在业务初步和完毕时,数据都有必要坚持一同状况。这意味着全部相关的数据spring面试题规矩都有必要运用于业务的修改,以坚持数据的完整性。
- 阻隔性(Isolation) :数据库体系供给必定的阻隔机制,确保业务在不受外部并发操作影响的”独立“环境实施。这意味着业务处理进程中的中心状况对外部是不行见的,反之亦然。
- 持久性(Durable) :业务完毕之后,它关于数据的修改是永久性的,即便出现体系毛病也能够springcloud五大组件坚持。
1mysql增删改查句子.2业务的阻隔线程等级
在高并发的状况下,要彻底确保其ACID特性是非常困难的,除非把全部的业务串行化实施,但带来的负面的影响将是功用大打折扣。许多时候我们有些业务对事mysql优化务的要求是不一样的,所以数据库中规划了四种阻隔等级,供用户依据业务进行挑选。
数据库默许阻隔等级:
Oracle中默许等级是 Read cmysql数据库ommitted
Mysql 中默许等级 Repeatable read
#检查mysql 的默许阻隔等级
SELECT @@tx_isolation
#设置为读未提交
set tx_isolation='read-uncommitted';
#设置为读已提交
set tx_isolation='read-committed';
#设置为可重复读
set tx_isolation='REPEATABLE-READ';
#设置为串行APP化
set tx_isolation='SERIALIZABLE';
并发业务处理带来的问题
- 更新丢掉(Lost Update)或脏写
当两个或多个业务挑选同一行,然后依据初步选定的值更新该行时,因为每线程和进程的区别是什么个业务都不知道其他业务的存在,就会产生丢掉更新线程池面试题问题–终究的更新覆盖了由其他业务所做的更新。
- 脏读(Dirty Reads)
一个业务appointment正在对一条记载做修改,在这个业务完毕并提交前,这条记载的数据就处于不一同的状况;这时,另一个业务也来读取同一条记载,假线程池创立的四种设不加操控,第二个业务读取了线程安全这些“脏”数据,并据此作进一数据库体系工程师步的处理,就会产生未提交的数据依托关数据库体系的中心是系。这种现象被形象的叫做“脏读”。
简略总结:业务A读取到了业务B现已修改但没有提交的数据,还在这个数据基础上做了操作。此刻,假定B业务回滚,A读取的数据无效,不符合一同性要求。
- 不行重读(Non-Repeatable Reads)
一个mysql装置装备教程业务在读取某些数mysql数据库命令大全据后的某个时刻,再次读取早年读过的数据,却发现其读出的数据现已产生了改动、或某些记载现已被删数据库办理体系除了!这种approach现象就叫做mysql索引“不行重复mysql面试题读”。
简略总mysql数据库命令大全结:业务A内部的相同查线程池询句子在不一起间读出的作用不一同,不符合阻隔性
- 幻读(Ph数据库体系antom Reads)
一个业务按相同的查询条件从头读取早年检索过的数据,却发现其他业务数据库体系的特征刺进了满意其查询条件的新数据,这种现象就称为“幻读”。
简略总结:业务A读取到app下载了业务B提交的新增数据,不数据库查询句子符合阻隔性
详细的隔数据库查询句子绝等级的实战演示省掉了
1.3锁线程安全机制
锁是核算机调和多个进程或线程并发拜访某一资源的机制。
在数据库中,除了传统的核算资源(如CPU、R数据库原理AM、I/O等)的争用以外,数据也是一种供需求用户同享的资源。怎样确保数据并发mysql句子拜访的一同线程池的七个参数性、有效mysql索引性是全部mysql句子数据库有必要处理mysql优化的一个问题,锁抵触也是影响数据库并发拜访功用的一个重app下载要因线程池素。
锁分类
- 从功用上分为豁达锁(用版别对比来完毕)和绝望锁
- 从对数据库操作的类型分,分为读锁和写锁(都属于绝望锁)
读锁(同享锁,S锁(Shared)):针对同一份数据,多个读操作mysql数据库命令大全能够一起进行而不会相互影响
写锁(排它线程安全锁,X锁(eXclusive)):当时写application操作没有结数据库束前,它会阻断其他写锁和读锁
- 从对数据操作的粒度分,分为表锁和行锁
表锁
每次操作锁住整张表。开支小,加锁快;不会出现死锁;确认粒度大,产生锁抵触的概率最数据库规划高,并发度最低;一般用在整表数据搬迁的场景。
1.4WAL原则
InnoDB的ARIES三原则Write Ahead Logging(WAL):
- 日志成功写入后业务就不会丢掉,后续由chec线程池的七个参数kpoint机制来确保磁盘物理文件与redo log抵达一同性;
- 运用redo log来记载改动后的数据,即redo里记载业务数据改动后的值;
- 运用undo log来记载改动前的数据,即undo里记载业务数据线程池创立的四种改动前的值,用于回滚和其他业务多版别读。
1.5并发事spring面试题务操控
-
单版别操控-锁
锁用独占的办法来确保在只要一个版其他状况下业务之间互相阻隔。
在 MySQL 事appearance务中,锁的完毕与阻隔等级有联系,在 RR(RepMySQLeatable Read)阻隔等级下,MySQL 为了处理幻读的问题,以牺牲并行度为代价,经过 Gap 锁来避免数据的写入,而这种锁,因为其并行度不行,抵触许多,常常会引起死锁。现在盛行的 Row 办法能够避免许多抵触app是什么意思乃至死锁问题,所以举荐默许运用 Row + RC(Read Committed)办法的阻隔等级,能够很大程度线程和进程的区别是什么上进步数据库的读写并行度。
-
MVCC多版别并发操控阻隔机制
Mysql在可重复读阻隔等级下怎样确保业务较高的阻隔性,相同的s数据库办理体系ql查询句子在一个业务里屡次实施查询作用相同,就算其它业务对数据有修改也不会影响当时业务sql句子的查询作用。
这个阻隔性便是靠MVCC(Multi-Version Concurrency Controlapplication)机制来确保的,对一行数据的读和写两mysql装置个操作默许是不会经过加锁数据库原理互斥来确保阻隔性,避免了一再加锁互斥,而在串行化阻隔等级为了确保较高的阻隔性是经过将全部操作加锁互斥来完毕的。
Mysql在读已提交和可重复读阻隔等级下都完毕了MVCC机制。
MVCC机制的完毕便是通mysql句子过read-spring_结构view机制与undo版别链比对机制,使得不同的业务会依据数据库体系工程师数据版别链对比规矩读取同一条数据在版别链上的不同版别数据。
undo日志版别链
关于运用InnoDspring面试题B存储引擎的表来说,它的聚簇索线程池创立的四种引记载中都包括两个必要的躲藏列(row_id并不是必要的,我们创立的表中有主键或许非NULL唯一键时都不会包括row_id列):
- trx线程和进程的区别是什么_id:每次对某条记载进行改动时,都会把对应的业务id赋值给trx_id躲藏列。
- roll_pointer:每次对某条记载进行改动时,这个躲藏列会存一个指针,能够经过这个指针找approach到该记载修改前的信息。
read view机制详解
关于运用READ UNCOMMITTED阻隔等级的业务来说,直接读取记载的最新版别就好了,关于运用S线程优化开不开ERIALIZABSpringLE阻隔等级的业务来说,运用加锁的办法来拜访记载。关于运用READ COMmysql数据库命令大全MITTED和REPEATABLE READ阻隔等级的业务来说,就需求用到mysql数据库我们上边所说的版别链了,中心问题便是:需求判别一下版别链中的哪个版别是当时业务可见的。
ReadView中首app下载要包括4个比较重要的内容:
- m_ids:标apple明在生成ReadView时当时体系中生动spring是什么意思的读写业务的springboot常用注解业务id列表。
- min_trx_id:标明在生成ReadView时当时体系中生动的读写业务中最小的业务id,也便是m_ids中的最小值。
- max_trx_id:标明生成ReaapproachdView时体系中应该分配给下一个业务数据库办理体系的id值。数据库体系
- creator_trx_id:标明生成该ReadView的业务的业务id。
留意max_tr线程优化开不开x_id并不是m_ids中的最大值,业务id是递加分配的。比如说mysql优化现在有id为1,2,3这三个业务,之后id为3的业务提交了。那么一个新的读业务在生成Re线程池的七个参数adView时,m_ids就包括1和2,min_trx_id的值便是1,max_trx_id的值便是4。
有了apple这个ReadView,这样在拜访某条记载时,只需求按照下边的进程判别记spring是什么意思载的某个版别是否可见:
-
假定被拜访版其他trx_id特征值与ReadView中的creator_trx_id值相同,意味着当时业务在拜访它自己修改正的记载,所以该版别能够被当时业务拜访。
-
假定被拜访版其他trx_id特征值小于ReadView中的min_trx_id值,标明生成该版其他业务在当时业务生成ReadView前现数据库已提交,所以该版别能够被当时业务拜访。
-
假定被拜访版其他springcloud五大组件trx_id特征值大于ReadVieappearw中的max_trx_id值,标明生成该版其他业务在当时业务生成ReadView后才翻开,所以该版别不行以被当时业务拜访。
-
假定被拜访版其他trx_id特征数据库值在ReadView的min_trx_id数据库是什么和max_trx_id之间,那就需求判别一下trx_imysql句子d特征值是不是在m_ids列表中,假定在,说明创立ReadView时生成该版其他业务仍是生动的,该版别不行以被拜访;假定不在,说明创立ReadView时生成该版其他业务现已mysql数据库被提交,该版springboot面试题别能够被拜访。
READ COMMITTED的完毕办法
每次读取数据前都生成一个ReadView
REPEATABLEapp是什么意思 READ完毕办法
在第一次读取数据时生成一个ReadView
题记:关于undo日志版别链与read view机制细节还需求讨论一下
二、Spring业务
2.1Spring 业务相关API
断mysql面试题点跟spring源码后在processon上画关于spring业务实施的流程图
www.processon.com/view/5eea03…
Spring 业务是在数据库业务的基础上进行封装扩展 其首要特性如下:
- 支撑原有的数据库业务的阻隔等级,参加spring_结构了业务传达的概念
- 供给多个业务的吞并或阻隔的功用
- 供给声明式业务,让业务代码与业务别离,业务变得更易用 (AOP)
大致描绘一下Spring 供给了业务相关接口:
TransactappleionDefinapplicationition
业务定义 : 业务的阻隔等级 业务的传达行为
public interface TransactionDefi数据库规划nition {
int PROPAGATION_REQUIRED = 0;
int PROPAGATION_SUPPORTS = 1;
int PROPAGATION_MANDATORY = 2;
int PROPAGATION_REQUIRES_NEW = 3;
int PROPAGapplicationATION_NOT_SUPPORTED = 4;
int PROPAGATION_NEVER = 5;
int PROPAGATION_NESTED = 6;
int ISOLATION_DEFAULT = -1;
int数据库体系 ISOLATION_READ_UNCOMMITTED = Connectmysql面试题ion.TRANSACTION_READ_UNCOMMITTED;线程优化开不开
int ISOLATION_READ_COMMITTED = Connection.TRANSACTION_READ_COMMITTED;
int ISOLATION_REPEATABLE_READ = Connection.TRANSACTION_REPEATABLE_READ;
int ISOLATIONspring是什么意思_SERIALIZABLE = Connection.TRANSACTION_SERI线程安全ALIZABLE;
int TIMEOUT_DEFAULT = -1;
int getPropagationBehavior();
int getIsolationLevel();
int getTimeout数据库规划();
boolean isReadOnly();
String getName();
}
TransactionAttribute
业务特征mysql装置装备教程,完毕了对回滚规矩的扩展(处理异常)
public intermysql装置face TransactionAttribute extends Tran线程安全sactionDefinition {
String getQuali数据库体系的特征fier();
boolean rollbackOn(Throwable ex);
}
PlatformTransactionManage数据库体系的特征r
渠道业务办理器
public interfmysql装置装备教程ace PlatformTransactionManager {
TransaAPPctionStatus gespringboottTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatu线程池的七个参数s status) throws TransactionException;
vo数据库体系的中心是id rollback(TransactionStatus status) throws TransactionException;
}
Transa数据库原理ctionStatus
业务运行时状况
public interface Tramysql面试题nsactionStatus extends SavepointManager, Flushable {
boolean isNewTraappstorensaction();
boolean hasSavepointmysql优化();
void setRollbackOnly();
boolean isRollapp是什么意思backOnly();
void flush();
boolean isapp下载Completed();
}
TransactioapplenInterceptor
业务拦截器,完毕了Met线程池hodInterceptor
public class TransactionInterceptor extends TransactionAspectSupp数据库体系的中心是ort implements MethodInterceptor, Serializable {
/**
* 创立新的Traapplicationnsmysql增删改查句子actionInterceptor
* 需求设置业务办理器和业务特征。
*/
public TransactionInterceptor() {
}
pubmysql暗码忘记了怎么办lic TransactionInterceptor(PlatformTransactionManager ptm, Properties attributes) {
setTransactionManager(ptm);
setTransactionAttributes(attributes)线程池;
}
public TransactionInterceptor(PlatformTransactionManager ptm, TransactionAttributeSource tas) {
setTr数据库ansactionManager(ptm);
setTrspring是什么意思ansactionAttributeSouspring_结构rce(tas);
}
@mysql面试题Override
@Nulappearancelable
public Object invoapproachke(MethodInvocation invocat数据库体系ion) throws Throwable {
Class<?> targetClass = (invocation.getThis() != null ? AopU线程池的七个参数tils.线程池的七个参数getTargetClass(invocation.getThis()) : null);
return invokeWithinTransaction(invocation.getMethod(), targetClass, invocat线程安全ion::proceed);
}
private void writeObjeapp是什么意思ct(ObjectOutputStream oos) th线程安全rows IOException {
oos.defaultWriteObject();
oos.writeObject(getTransactionManagerBeanName());
oos.writeObject(getT数据库体系概论第五版课后答案ransactionManager());
oos.writeObject(getTransacmysql装置装备教程tionAttributeSource()线程的几种状况);
oos.wrspring面试题iteObject(ge线程池面试题tBeanFactory());
}
private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundExceptmysql增删改查句子ion {
oisappear.defaultReadObspringboot面试题ject();
setTransactionManagerBeanName((String) ois.readObject());
setTransactionManager((Platformysql面试题mTransacmysql数据库tionManager) ois.readObject());
setTransactionAttributeSource((Trans数据库体系工程师actionAttributeSmysql索引ource) ois.readObject());
setBeanFactory((BeanFactory) ois.readObject());
}
}
找业务拦截器
中心:Transactionmysql数据库Interceptor#invoke
TransactionAspectSupport
业务切面支撑, 内部类TransactionInfo封装了业务相关特征
TransactionAspectSupport.TransacAPPtionInfo
protected final class TransactionInfo {
@Nullabapplicationle
private final PlatformTransactionManager transactionManager;
@Nullable
private final TransactionAttribute transactionAttribute;
private final String joinpointIdentification;
@Nullable
pspring是什么意思rivate TransactionSta数据库体系概论第五版课后答案tus transaspringmvc的工作原理ctionStaspring面试题tus;
@Nullable
private TransactionInfo oldTransactionInfo;
2.2编程式业务和声明式业务
编程式业务
演示代码:
public class SpringTransactionExample {
priva数据库规划te static String url = "jdbc:mysql://127.数据库体系的中心是0.0.1:3306/test";
private static String user = "root";
pmysql优化rivate static String password = "root";
pspringboot面试题ublic static void main(String[] args) {
// 获取数据源
finspring_结构al线程 DataSource ds = new DriverManagerDataSource(url, user, password);
// 编程式业务
final TransactionTemplate template = new TransactAPPionTemplate();
// 设置业务办理器
templamysql句子te.setTransactionManager(new DataSourceTransactionManager(ds));
temp线程池创立的四种laMySQLte.execute(new TransactionCallback<Object>() {
@mysql索引Override
public Obje数据库查询句子ct doInTransaction(Trmysql索引ansactionStatus status) {
Connectionmysql装置装备教程 conn = DataSourceUtils.getConnectspring面试题ion(ds);
Object savePoint = null;
try {
{
// 刺进
PreparedStatement prepare = conn.
prepareStatement(
"insert INTO account (accountName,user,money) VALUES (?,?,?)");
preparemysql装置.setString(1, "111");
pr数据库epare.setString(2, "aaa");
prepare.setInt(3,springcloud 10000);
prepare.executeUpdate();
}
// 设置保存点
savePoint = status.createSavepoint();
{mysql面试题
// 刺进
PreparedStateappreciateme数据库体系工程师nt prepare = conn.
prepareStatement(
"insert INTO account (accountName,user,money) VALUES (?,?,?)");
prepare.setString(1, "222");
prepare.setString(2, "bbb");
prepare.数据库是什么setInt(3, 10000);
prepare.executeUpdate();线程池
}
{
// 更新
PreappstoreparedStatement prepare = cmysql暗码忘记了怎么办onn.prepareStatement(
"UPDATE account SET money= money+100 where user=?");
prepappreciateare.setString(1, "aaa");
prepare.execu数据库办理体系teUpdate();
//int i=1/0;
}
} catch (SQLException数据库办理体系 e) {
e.printStackTrace();
} cspring_结构atch (Exceptspringmvc的工作原理ion e) {
System.out.println("更新失利");
if (savePoint != null) {
status.rollbackToSavepoint(savePoin线程撕裂者t);
} else {
status.setRollbackOnly();
}
}
return null;
}
});
}
}
声明式app下载业务
@Tmysql装置装备教程ransactionspring是什么意思al
<!-- 翻开业务操控的注解支线程池面试题撑 -->
<tx:annotation-driven transaction-manager="t线程池创立的四种xMa线程池面试题nager"/>
业务注解装备,作用于类,办法上
特征名 | 说明 |
---|---|
name | 当在装备文件中有多个 TransactionMana线程的几种状况ger , 能够用该特征指定挑选哪个业务办理器。 |
propagation | 业务的传达行为,默许值为 REQUIRspring是什么意思ED。 |
isolation | 业务的阻隔度,默许值选用 DEFAUappearLT。 |
timeout | 业务的超时APP时刻,默许值为-1。假定逾越该时刻约线程束但业务还没有完毕,则自动回滚业务。 |
read-only | 指定业务是否为只读业务,默许值为 false;为了疏忽那些不需求业务的办法,比如读取数据,能够设置 read-only 为 true。 |
rollmysql优化back-for | 用于指定能够触发业务回滚的异常类型,假定有多个异常类型需求指定,各类型之间能够经过逗号分隔。 |
no-rollback- for | 抛数据库是什么出 no-rollback-for 指定的异常类型,不回滚业务。 |
Java Configuration
@EnableTransactionManagement
运用TransactionManagementConfigurationSelector向容器中注册两个组mysql数据库件
-
AutoProxyRegistrar
给容器中注册一个 InfrastructureAdvisorAutoP数据库体系工程师roxyCreator 的后置处理器,回来一个署理政策(增强器),署理政策实施办法运用拦截器链进行调用;
-
ProxyTransactionManagementConfiguration 是一个@Configuration
-
给容器中注册业务增强器transactionAdvisor;
-
AnnotationTransactionAttributeSource解析业务注解
-
业务拦截器t数据库是什么ransactionInterceptor
-
@springbootConfiguration
@ComponentScan("com.xuchang")
@EnableTransactionManagement
@EnableAspectJAutoProxy(proxyTargetClass = true)
pubmysql优化lic class AppConfig {
@Bean
public DataSource datamysql数据库Source(){
DriverManagerDataSoumysql增删改查句子rce d线程ataSource = new Dri线程池创立的四种verManagerDataSourceapp是什么意思();
dataSource.setDriverClassName("com.mysql装置mysqspring是什么意思l.jdbc.Driver");
dataSource.setUrl("jdbc:mysql线程池的七个参数://localhost:3306/test?characterEmysql数据库命令大全ncoding=utf8");
dataSourceSpring.setUsername数据库原理("roo数据库原理t");MySQL
dataSource.springbootsetPassword("rooapproacht");
return dataSoumysql句子rce;
}
@Bean
public JdbcTmysql优化emplate jdbcTemplate(DataSource dataSource) {
r线程撕裂者eturn n线程的几种状况ew JdbcTemplate(dataSource);
}
@Bean
public PlatformTrans线程池面试题actionappreciateManager traapp下载nsactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSourcespringboot面试题);
}
}
2.spring是什么意思3业务失效问题
-
Bean是否是署理政策
-
进口函数是否是pmysql索引ublic的
-
数据库是否支撑业务(Mysql的MyIsam不支撑业务) ,行锁才支撑业务
-
切点是否装备正确
-
内部办法间调用导致业务失效
因为this不线程安全是署理政策,能够装备 expose-proxy=”true” ,就能够经过AopContext.currentProxy()数据库体系概论第五版课后答案获取
到当时类的署理政策。
<!-- expose-proxy="true" 类内部能够获取到当时类的署理政策 --> <aomysql面试题p:aspectj-autoproxy expose-proxy="true"/>
@EnableAspectJAutoapproachProxy(exposeProxy = true)
也能够注入当时bean
-
异常类型是否装备正确
默许只支撑 RuntimeExceptispring_结构on和Error ,不支撑检数据库规划查异常
想要支撑检查异常需装备rollbackFor
@Transactional(rollbackFor = Exception.class)
异常体系:
源码分析
#找业务拦截apple器
TransactionInterceptor#invoke
# 业务相关的调用
TransactionAspectSupport#invokeWithinTransactionspring
#异常回滚的逻辑
TransactionAspSpringectSuppspringmvc的工作原理ort#completeTransactionAfterThrowinappreciateg
#异常回滚
txInfo.transactionAt线程安全tribute.rollbackOn(ex)
#能够设置异常回滚规矩
RuleBasedTransacti数据库体系的特征onAttribute#rollbackOn
# 默许的异常回滚规矩
Defmysql句子aultTransactionAttribute#rollbackOn
public bmysql数据库命令大全oolean rollbackOn(Tmysql装置装备教程hrowable ex) {
return (ex instanceof RuntimeException || ex instanceof Error);
}mysql数据库命令大全
2.4业务的传达机制
sappreciatepring在TransactionDefinition接口中定义了七个业务传达行为:
- propagation_requierd:假定当时没有业务,就新建一个业务,假定已存在一个业务中,线程池参加到这个业务中,这是最常见的挑选。
- propagation_supports:支撑当时事线程是什么意思务,假数据库体系的中心是设没有当时业务,就以非业务办法实施。
- propagation_mandatory:运MySQL用当时MySQL业务springcloud,假定没有当时业务,就抛出异常。
- propagation_required_new:新建业务,假定当时存线程在业务,把当时业务挂起。
- propagation_not_smysql优化upporte线程池创立的四种d:以非业务办法实施操作,假定当时存在业务,就把当时业务挂起。
- propagation_never:以非业务办法实施操作,假定当时业务存在则抛出异常。
- propagation_nested:假定当时存在业务,则在嵌套业务内实施。假定当时没有业务,则实施与propagation_required类似的操作
常用业务传达机数据库原理制:
-
PROPAGATImysql索引ON_REQUIRED
这个也是默许的传达机制;
-
PROPAGATION_REQUIREMySQLS_NEW
总是新启一个业务,这个传达机制适用于不受父办法业务影响的操作,比如某些业务场景下需求记载业务mysql优化日志,用于异步反查,那么不论主体业务逻辑是否完毕,spring日志都需求记载下来,不能因为主体业务逻辑报错而丢掉日志;
-
PROPAGATION_NOT_SUPPORTED
能够用于发送提示消息,站线程内信、短信、邮件提示等。不属于而且不应当影响主体业务逻辑,即便发送失利也不应该对主体业务逻辑回滚。
2.5源码分析
#找业务拦截器
TransactionapplicationInterceptor#invoke
# 业务相关的调用
>TransactionAspectSupport#invokeWithinTransaction
#回数据库体系概论第五版课后答案来业务信息 Tra线程nsa线程池面试题ctionInfo
>TransactionAspectSupport#createTransactionIfNecessary
# 回来 Transactio数据库nStatus 包括业务传达特征的逻辑
>AbstractPlatformTransactionmysql索引Manager#getTransaction
断点跟spring源码后在processon上画关于spring业务实施的流程图
www.processon.com/view/5eea03…