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 地址 】