Spring 框架应该是每一个人 javaer 都必须接触和学习的技术,Spring 公司所提供的各种框架是 Java 开发行业可参考的重要标准之一。
Spring 中有 7 种类型的事务传播行为。事务传播行为是 Spring 框架提供的一种事务管理方式,它是 Spring 框架之中非常重要的一个技术点,毕竟事务关系到应用程序和数据库的交互,而数据更是互联网行业最为重要的资源。
平时开发过程中事务都会有使用,但是没有真正地总结过,尤其是事务中嵌套事务的场景,此篇基础知识文在此做一个简单的学习总结,
准备动作:新建一个 spring 项目,数据库脚本见:
SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for customer -- ---------------------------- DROP TABLE IF EXISTS `customer`; CREATE TABLE `customer` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; -- ---------------------------- -- Records of customer -- ---------------------------- BEGIN; INSERT INTO `customer` VALUES (1, 'A', 'a'); INSERT INTO `customer` VALUES (2, 'B', 'b'); INSERT INTO `customer` VALUES (3, 'C', 'c'); COMMIT; SET FOREIGN_KEY_CHECKS = 1;
测试步骤为:方法 A 中调用方法 B 和 方法 C,三个方法各自操作数据库中的一条数据,然后方法 A、B、C 组合添加事务
伪代码为:
function A(){ // 方法 A
functionB(); // 方法 B
functionC(); // 方法 C
}
@Transactional
function A(){ // 有事务
functionB(); // 无事务,代码正常
functionC(); // 无事务,代码抛异常
}
function A(){ // 无事务
functionB(); // 有事务,代码正常,事务为:@Transactional(propagation = Propagation.SUPPORTS)
functionC(); // 有事务,代码抛异常,事务为:@Transactional(propagation = Propagation.SUPPORTS)
}
function A(){ // 无事务
functionB(); // 有事务,代码正常,事务为:@Transactional(propagation = Propagation.MANDATORY)
functionC(); // 有事务,代码抛异常,事务为:@Transactional(propagation = Propagation.SUPPORTS)
}
org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory' IllegalTransactionStateException 异常。 function A(){ // 有事务
insert one data;
functionB(); // 有事务,代码正常,事务为:@Transactional(propagation = Propagation.REQUIRES_NEW)
functionC(); // 有事务,代码抛异常,事务为:@Transactional(propagation = Propagation.REQUIRES_NEW)
}
function A(){ // 有事务
functionB(); // 无事务,代码正常,添加注解:@Transactional(propagation = Propagation.NOT_SUPPORTED)
functionC(); // 无事务,代码抛异常,添加注解:@Transactional(propagation = Propagation.NOT_SUPPORTED)
}
function A(){ // 有事务
functionB(); // 无事务,代码正常,添加注解:@Transactional(propagation = Propagation.NEVER)
functionC(); // 无事务,代码抛异常,添加注解:@Transactional(propagation = Propagation.NEVER)
}
org.springframework.transaction.IllegalTransactionStateException: Existing transaction found for transaction marked with propagation 'never' function A(){ // 有事务
insert one data;
functionB(); // 有事务,代码正常,事务为:@Transactional(propagation = Propagation.NESTED)
functionC(); // 有事务,代码抛异常,事务为:@Transactional(propagation = Propagation.NESTED)
throw exception;
}
org.springframework.transaction.NestedTransactionNotSupportedException: JpaDialect does not support savepoints - check your JPA provider's capabilities demo 的源码见:【 GitHub 地址 】