PlatformTransactionManager
PlatformTransactionManager接口提供commit提交事务功能
public interface PlatformTransactionManager extends TransactionManager {
TransactionStatus getTransaction(@Nullable TransactionDefinition definition)
throws TransactionException;
void commit(TransactionStatus status) throws TransactionException;
void rollback(TransactionStatus status) throws TransactionException;
}
AbstractPlatformTransactionManager
AbstractPlatformTransactionManager继承PlatformTransactionManager接口实现commit功能;
commit中调用processCommit方法;
processCommit方法提供事务执行前置(triggerBeforeCommit)、后置(triggerAfterCommit)、结束(triggerAfterCompletion)等操作,在这些操作中调用TransactionSynchronizationUtils的前置(triggerBeforeCommit)、后置(triggerAfterCommit)、结束(triggerAfterCompletion)等操作;
public abstract class AbstractPlatformTransactionManager implements PlatformTransactionManager, Serializable {
@Override
public final void commit(TransactionStatus status) throws TransactionException {
// 省略部分代码
processCommit(defStatus);
}
private void processCommit(DefaultTransactionStatus status) throws TransactionException {
try {
boolean beforeCompletionInvoked = false;
try {
boolean unexpectedRollback = false;
prepareForCommit(status);
triggerBeforeCommit(status);
triggerBeforeCompletion(status);
beforeCompletionInvoked = true;
// 省略部分代码
}
catch (UnexpectedRollbackException ex) {
// can only be caused by doCommit
triggerAfterCompletion(status, TransactionSynchronization.STATUS_ROLLED_BACK);
throw ex;
}
catch (TransactionException ex) {
// can only be caused by doCommit
if (isRollbackOnCommitFailure()) {
doRollbackOnCommitException(status, ex);
}
else {
triggerAfterCompletion(status, TransactionSynchronization.STATUS_UNKNOWN);
}
throw ex;
}
catch (RuntimeException | Error ex) {
if (!beforeCompletionInvoked) {
triggerBeforeCompletion(status);
}
doRollbackOnCommitException(status, ex);
throw ex;
}
try {
triggerAfterCommit(status);
}
finally {
triggerAfterCompletion(status, TransactionSynchronization.STATUS_COMMITTED);
}
}
finally {
cleanupAfterCompletion(status);
}
}
protected final void triggerBeforeCommit(DefaultTransactionStatus status) {
if (status.isNewSynchronization()) {
if (status.isDebug()) {
logger.trace("Triggering beforeCommit synchronization");
}
TransactionSynchronizationUtils.triggerBeforeCommit(status.isReadOnly());
}
}
protected final void triggerBeforeCompletion(DefaultTransactionStatus status) {
if (status.isNewSynchronization()) {
if (status.isDebug()) {
logger.trace("Triggering beforeCompletion synchronization");
}
TransactionSynchronizationUtils.triggerBeforeCompletion();
}
}
private void triggerAfterCommit(DefaultTransactionStatus status) {
if (status.isNewSynchronization()) {
if (status.isDebug()) {
logger.trace("Triggering afterCommit synchronization");
}
TransactionSynchronizationUtils.triggerAfterCommit();
}
}
private void triggerAfterCompletion(DefaultTransactionStatus status, int completionStatus) {
if (status.isNewSynchronization()) {
List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
TransactionSynchronizationManager.clearSynchronization();
if (!status.hasTransaction() || status.isNewTransaction()) {
if (status.isDebug()) {
logger.trace("Triggering afterCompletion synchronization");
}
invokeAfterCompletion(synchronizations, completionStatus);
}
else if (!synchronizations.isEmpty()) {
registerAfterCompletionWithExistingTransaction(status.getTransaction(), synchronizations);
}
}
}
}
TransactionSynchronizationUtils
TransactionSynchronizationUtils提供triggerBeforeCommit、triggerAfterCommit、triggerAfterCompletion等方法,在这些方法中遍历事务同步管理器TransactionSynchronizationManager.getSynchronizations()去执行前置或者后置操作
public abstract class TransactionSynchronizationUtils {
public static void triggerFlush() {
for (TransactionSynchronization synchronization : TransactionSynchronizationManager.getSynchronizations()) {
synchronization.flush();
}
}
public static void triggerBeforeCommit(boolean readOnly) {
for (TransactionSynchronization synchronization : TransactionSynchronizationManager.getSynchronizations()) {
synchronization.beforeCommit(readOnly);
}
}
public static void triggerBeforeCompletion() {
for (TransactionSynchronization synchronization : TransactionSynchronizationManager.getSynchronizations()) {
try {
synchronization.beforeCompletion();
}
catch (Throwable ex) {
logger.debug("TransactionSynchronization.beforeCompletion threw exception", ex);
}
}
}
public static void triggerAfterCommit() {
invokeAfterCommit(TransactionSynchronizationManager.getSynchronizations());
}
public static void invokeAfterCommit(@Nullable List<TransactionSynchronization> synchronizations) {
if (synchronizations != null) {
for (TransactionSynchronization synchronization : synchronizations) {
synchronization.afterCommit();
}
}
}
public static void triggerAfterCompletion(int completionStatus) {
List<TransactionSynchronization> synchronizations = TransactionSynchronizationManager.getSynchronizations();
invokeAfterCompletion(synchronizations, completionStatus);
}
public static void invokeAfterCompletion(@Nullable List<TransactionSynchronization> synchronizations,
int completionStatus) {
if (synchronizations != null) {
for (TransactionSynchronization synchronization : synchronizations) {
try {
synchronization.afterCompletion(completionStatus);
}
catch (Throwable ex) {
logger.debug("TransactionSynchronization.afterCompletion threw exception", ex);
}
}
}
}
}
TransactionSynchronizationManager
TransactionSynchronizationManager提供注册同步操作(registerSynchronization)和查询同步操作(getSynchronizations)方法;
public abstract class TransactionSynchronizationManager {
private static final ThreadLocal<Set<TransactionSynchronization>> synchronizations =
new NamedThreadLocal<>("Transaction synchronizations");
public static void registerSynchronization(TransactionSynchronization synchronization)
throws IllegalStateException {
Assert.notNull(synchronization, "TransactionSynchronization must not be null");
Set<TransactionSynchronization> synchs = synchronizations.get();
if (synchs == null) {
throw new IllegalStateException("Transaction synchronization is not active");
}
synchs.add(synchronization);
}
public static List<TransactionSynchronization> getSynchronizations() throws IllegalStateException {
Set<TransactionSynchronization> synchs = synchronizations.get();
if (synchs == null) {
throw new IllegalStateException("Transaction synchronization is not active");
}
if (synchs.isEmpty()) {
return Collections.emptyList();
}
else {
List<TransactionSynchronization> sortedSynchs = new ArrayList<>(synchs);
OrderComparator.sort(sortedSynchs);
return Collections.unmodifiableList(sortedSynchs);
}
}
}
注册事务同步操作例子
TransactionSynchronizationManager.registerSynchronization 方法注册事务同步操作
编程式事务
@Service
public class CarOrderReplaceSubmitServices implements CarOrderSubmitServices {
private final static Logger LOGGER = LoggerFactory.getLogger(CarOrderReplaceSubmitServices.class);
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private CarOrderDao carOrderDao;
@Override
public Integer submit(CarOrderSubmitReqDto reqDto) {
CarOrderEntity carOrderEntity = new CarOrderEntity();
carOrderEntity.setOrderNo(reqDto.getOrderNo());
carOrderEntity.setCarNo(reqDto.getCarNo());
/**
* 编程式事务带返回值
* 异常会自动回滚
*/
Integer id = transactionTemplate.execute(transactionStatus -> {
// 注册执行事务提交后置操作
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void beforeCommit(boolean readOnly) {
LOGGER.info("事务提交前......");
}
@Override
public void afterCommit() {
LOGGER.info("事务提交后......");
}
/**
* 不管事务成功还是失败,当事务完成后就会执行
* @param status
*/
@Override
public void afterCompletion(int status) {
LOGGER.info("事务执行完成......");
}
});
// 执行数据库事务操作
carOrderDao.add(carOrderEntity);
Integer tempId = carOrderEntity.getId();
// 执行数据库更新操作
this.updateStock(carOrderEntity, 1);
return tempId;
});
return id;
}
@Override
public void updateStock(CarOrderEntity carOrderEntity, Integer stockCount) {
carOrderDao.updateStockByCarNo(carOrderEntity.getCarNo(), stockCount);
}
}
声明式事务
@Service
public class CarOrderSelfSubmitServices implements CarOrderSubmitServices {
private final static Logger LOGGER = LoggerFactory.getLogger(CarOrderSelfSubmitServices.class);
@Autowired
private CarOrderDao carOrderDao;
@Override
@Transactional(propagation = Propagation.REQUIRED,rollbackFor = {Exception.class,RuntimeException.class})
public Integer submit(CarOrderSubmitReqDto reqDto) {
CarOrderEntity carOrderEntity = new CarOrderEntity();
carOrderEntity.setOrderNo(reqDto.getOrderNo());
carOrderEntity.setCarNo(reqDto.getCarNo());
// 执行事务提交后置操作
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
@Override
public void beforeCommit(boolean readOnly) {
LOGGER.info("事务提交前......");
}
@Override
public void afterCommit() {
LOGGER.info("事务提交后......");
}
/**
* 不管事务成功还是失败,当事务完成后就会执行
* @param status
*/
@Override
public void afterCompletion(int status) {
LOGGER.info("事务执行完成......");
}
});
carOrderDao.add(carOrderEntity);
Integer id = carOrderEntity.getId();
this.updateStock(carOrderEntity, 1);
return id;
}
@Override
public void updateStock(CarOrderEntity carOrderEntity, Integer stockCount) {
carOrderDao.updateStockById(carOrderEntity.getId(),stockCount);
}
}
注册事务同步操作对编程式事务和声明式事务同样有效