0. 一个普通的扩展坞300多,有点丁真了
jdbc操作savepoint的简易demo
JDBC和数据库事务详解
Spring事务,挺细的一个源码走读
关于PROPAGATION_NESTED的理解
MySQL InnoDB的默认隔离级别为不可重复读
Propagation.REQUIRES_NEW导致LockWaitTimeOutException
一位热心博主的错题集
超时参数的说法
关于NESTED隔离级别的一些细节
Mybatis事务处理中的sqlSessionTamplate
这篇文章让我联想到了REQUEST_NEW+表锁造成程序死锁的问题
SqlSessionTemplate 和 SqlSessionManager
1. TransactionDefinition:当前事务解析后的属性
- 传播行为、隔离级别、超时 等事务属性
- getName() -String
- withDefaults() -TransactionDefinition
1.1 TransactionAttribute
- getQualifier() -String,用于选择特定的事件管理器
- rollbackOn(Throwable) -boolean,该抛出类型是否满足回滚的特征
1.2 TransactionAttributeSource:TransactionAttribute的包装类
- isCandidateClass(Class<?> targetClass) -boolean,入参是否为当前事务的候选类
- getTransactionAttribute(Method method, Class<?> targetClass) -TransactionAttribute
2. TransactionStatus:事务状态
- hasSavepoint() -boolean,当前事务是否存在保存点
2.1 AbstractTransactionStatus
- Object savepoint,记录嵌套事务中父级事务的保存点
- boolean completed,当前事务是否已结束(回滚结束 或 提交结束)
- boolean rollbackOnly,当前事务是否需要回滚
2.2 DefaultTransactionStatus
- Object transaction,实际的事务实现对象,类型为SavepointManager
- Object suspendedResources, 被挂起的事务资源
- boolean newTransaction,是否是一个新建的、顶层的事务(真实事务或空事务)
- boolean newSynchronization,是否与线程同步(即绑定事务资源resource到当前线程的)
3. ResourceHolder:事务同步的资源
- reset() -void
- unbound() -void
- isVoid() -boolean,true:被视为无效的resourceHolder
3.1 ResourceHolderSupport
- Date deadline ,该holder的超时时长
- referenceCount,该holder被持有的总数
- boolean isVoid,该holder是否无效
- boolean synchronizedWithTransaction,该holder与事务同步(多个事务可以持有同一个holder资源嘛)
3.1.1 ConnectionHolder
- Connection currentConnection
- ConnectionHandle connectionHandle,就俩API,get/releaseConnect
- Boolean savepointsSupported
- int savepointCounter,设置的保存点总数
- boolean transactionActive,该holder是否参与到事务当中
4. TransactionManager:事务管理器的标记接口
4.1 PlatformTransactionManager:模板模式的事务管理器API规范
- getTransaction(TransactionDefinition definition) -TransactionStatus throws TransactionException
- commit() -void throws TransactionException
- rollback() -void throws TransactionException
4.1.1 ResourceTransactionManager
- getResourceFactory -Object 返回此事务管理器操作的资源工厂,例如 JDBC DataSource 或 JMS ConnectionFactory
4.1.2 AbstractPlatformTransactionManager:维护了一坨默认的事务管理器的属性
-
int transactionSynchronization,始终激活事务
官方文档注释:请注意,不同事务管理器的多个并发事务不支持事务同步。任何时候都只允许一个事务管理器激活它 -
int defaultTimeout,不设时限
-
boolean nestedTransactionAllowed,不允许嵌套事务
-
boolean validateExistingTransaction,嵌套事务(这里的说的嵌套,可能是空事务)之前不做适用性验证(也是说简单粗暴的应用外部的事务,具体的验证与传播行为相关)
官方文档注释:此外部事务的特征甚至适用于内部事务范围。验证将检测内部事务定义上不兼容的隔离级别和只读设置,并通过抛出相应的异常拒绝参与 -
boolean globalRollbackOnParticipationFailure,在参与到事务失败时做全局(这种说法是形容嵌套事务的时候)回滚(假如改为false:事务失败时将不会自动回滚,而是转交给调用者决定)
官方文档注释:建议子事务失败时采用’嵌套事务’的做法,就像PROPAGATION_NESTED的语义做的那样:子事务失败时自身回滚,全局(父事务)回滚到子事务开始时的保存点 -
boolean failEarlyOnGlobalRollbackOnly
所有事务管理器只会在最外层事务边界处引发 UnexpectedRollbackException(假如改为false,那么将不会等到回到最外层事务时才抛出异常) -
boolean rollbackOnCommitFailure,回滚失败时提交
-
doGetTransaction() -Object,返回实际的事务对象(例如:DataSourceTransactionObject)
-
isExistingTransaction(Object transaction) -boolean,该事务是否被开启(处于嵌套之中也算)
-
useSavepointForNestedTransaction() -boolean,是否为嵌套事务使用保存点,委托 DefaultTransactionStatus 来创建和保存保存点
-
doBegin() -void,开启一个新事物(此时事务传播行为已被引用,不必关心),注意:执行该方法时之前的事务必须被suspend(挂起)
-
doResume(Object transaction, Object suspendedResources),恢复事务,在事务恢复之后,将发生事务同步
-
shouldCommitOnGlobalRollbackOnly() -boolean,如果具体事务管理器即使对于仅回滚事务也期望doCommit调用,则覆盖它以返回“true”
-
prepareForCommit(DefaultTransactionStatus status) -void,发生在事务提交之前
-
doCleanupAfterCompletion(Object transaction) -void,事务完成后清理资源
-
(内部类)DataSourceTransactionManager
DataSource dataSource
boolean enforceReadOnly,默认false
(内部类) DataSourceTransactionObject
5. TransactionSynchronization:事务资源处理的回调接口
- spring事务框架所定义的诸多事务事件(提交、回滚、保存点创建或恢复 等等)最终均会反应到TransactionSynchronization的回调方法里对事务资源的操作上。
- TransactionSynchronizationManager将为其提供绑定到当前线程的事务资源的相关信息。
- 栗子:数据事务场景中SqlSessionSynchronization提供的事务资源的同步是针对SqlSession的,框架中ConnectHolder则通过调用底层数据库连接池的连接代理对象提供了数据库连接资源的事务同步
- int STATUS_COMMITTED 正确提交时的状态
- int STATUS_ROLLED_BACK 事务回滚时的状态
- int STATUS_UNKNOWN 事务异常时的状态
- suspend() -void
- resume() -void
- @Override flush() -void
- beforeCommit(boolean readOnly) -void,该方法仍可以发生事务回调
- beforeCompletion() -void,提交/回滚之前回调
- afterCommit() -void
- afterCompletion() -void,常做一些资源的清理
5.1 TransactionSynchronizationManager:线程的TransactionSynchronization管理器
该类并不是 TransactionManager 的实现类
- ThreadLocal<Map<Object, Object>> resources,绑定到当前线程的资源(比如说resourceHolder)
- getResource(Object key)
- doGetResource(Object actualKey)
- ThreadLocal<Set> synchronizations,活跃的transactionSynchronization
- ThreadLocal currentTransactionName,当前线程活跃的事务的name
- ThreadLocal currentTransactionReadOnly
- ThreadLocal currentTransactionIsolationLevel
- ThreadLocal actualTransactionActive,当前线程是否存在活跃的事务
6. TransactionInfo:TransactionAspectSupport的静态内部类
封装了当前事务调度相关的类
- PlatformTransactionManager transactionManager
- TransactionAttribute transactionAttribute
- String joinpointIdentification
- TransactionStatus transactionStatus
- TransactionInfo oldTransactionInfo,之前一个事务的TransactionInfo,呈链表形式
7. SavepointManager:事务保存点管理器
// @see java.sql.Connection#setSavepoint
createSavepoint() -Object,允许创建一个新的保存点。
您可以通过rollbackToSavepoint到特定的保存点,并通过releaseSavepoint显式释放您不再需要的保存点。
大多数事务管理器将在事务完成时自动释放保存点
// @see java.sql.Connection#rollback(java.sql.Savepoint)
rollbackToSavepoint(Object savepoint) -void,回滚到给定的保存点。
保存点之后不会自动释放,但允许手动释放(事务完成也会自动释放)
// @see java.sql.Connection#releaseSavepoint
releaseSavepoint(Object savepoint) -void,用于显式的释放保存点
7.1 JdbcTransactionObjectSupport
- ConnectionHolder connectionHolder
- Integer previousIsolationLevel,前一个事务的隔离级别
- @Override createSavepoint() -Object
7.1.1 DataSourceTransactionObject in DataSourceTransactionManager
- boolean newConnectionHolder
- boolean mustRestoreAutoCommit,恢复成自动提交
8. TransactionExecution
- isNewTransaction() -boolean
- setRollbackOnly() -void
- isRollbackOnly() -boolean
- isCompleted() -boolean