`

事务控制@Transactional

    博客分类:
  • SSM
 
阅读更多
自己给自己挖了个坑,做单元测试的时候,跑代码,发现预约失败异常的时候,控制台不打印错误具体信息。

,原因是重复预约,异常信息被throw了,没有return封装的异常对象。

@Transactional
	public AppointExecution appoint(long bookId, long studentId) {
		try {
			// 减库存
			int update = bookDao.reduceNumber(bookId);
			if (update <= 0) {// 库存不足
				//return new AppointExecution(bookId, AppointStateEnum.NO_NUMBER);//错误写法				
				throw new NoNumberException("no number");
			} else {
				// 执行预约操作
				int insert = appointmentDao.insertAppointment(bookId, studentId);
				if (insert <= 0) {// 重复预约
					//return new AppointExecution(bookId, AppointStateEnum.REPEAT_APPOINT);//错误写法
					//return new AppointExecution(bookId,AppointStateEnum.REPEAT_APPOINT);
					throw new RepeatAppointException("repeat appoint");
				} else {// 预约成功
					Appointment appointment = appointmentDao.queryByKeyWithBook(bookId, studentId);
					return new AppointExecution(bookId, AppointStateEnum.SUCCESS, appointment);
				}
			}...

 单元测试的代码

@Test
	public void testInsertAppointment() throws Exception {
		long bookId = 1000;
		long studentId = 12345678910L;
		int insert = appointmentDao.insertAppointment(bookId, studentId);
		System.out.println("insert=" + insert);
	}

 

将处理的代码改了,重复预约的时候 return new AppointExecution(bookId,AppointStateEnum.REPEAT_APPOINT);

控制台成功打印出预约失败的信息 Ok.

 

做成页面请求预约动作时,发现一个问题,预约失败,但库存在不断减少。

表示 库存减1 动作完成,但是预约失败,库存减1动作没有回滚。

明显事务控制出了问题。

 

查了注解方式的事务控制,写的都唔问题。

原来处理逻辑里面,碰到重复预约的时候,return了,没有抛出异常,那么事务当然不会回滚。

导致其实是重复预约的,库存减1被commit了。

 

代码改回throw new RepeatAppointException("repeat appoint"); 事务生效。

分享到:
评论

相关推荐

    后端 Java Spring Data Jpa @Transactional 介绍

    这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,从而确保数据的一致性和完整性。 **一、什么是事务(Transaction)** 事务是一组逻辑操作,这些操作被视为一个单一的工作单元。如果事务中...

    Spring3事务管理——使用@Transactional 注解.rar

    - 尽可能地在细粒度的层面上使用`@Transactional`,避免在整个服务类上使用,以提高事务控制的灵活性。 - 考虑使用`@Transactional(readOnly = true)`来标记只读事务,这样Spring可以优化事务处理,比如跳过回滚...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    同时,你可以定义自定义的事务注解,以实现更灵活的事务控制。 例如,假设你创建了一个名为`CustomTransactionManager`的类,你可以这样使用自定义事务注解: ```java @Retention(RetentionPolicy.RUNTIME) @...

    Spring声明式事务@Transactional知识点分享

    其中,readOnly 用于读写事务控制,propagation 用于枚举事务的传播行为,isolation 用于设置事务隔离级别。 readOnly 属性用于控制事务的读写行为。如果 readOnly=true,则所注解的方法或类只是读取数据,不会进行...

    Spring中@Transactional事务回滚(含实例

    `@Transactional`注解简化了Java开发中的事务管理,使得我们可以专注于业务逻辑,而无需关心底层的事务控制。了解其工作原理和回滚规则,有助于我们在实际开发中更有效地利用这一功能,避免数据不一致性和业务错误。...

    Spring @Transactional工作原理详解

    它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@Transactional`的工作原理,以及其与JPA、持久化上下文(Persistence Context)和数据库事务的...

    带有@Transactional和@Async的循环依赖问题

    它通常用于提高系统的并发性能,但同时也意味着方法间的顺序执行和事务控制可能会变得复杂。 现在,让我们深入到Spring的源码中,探讨这个问题的根源。当Spring容器初始化时,对于带有`@Service`或`@Component`等...

    Spring中的@Transactional事物回滚实例源码

    3. **编程式事务管理**:虽然不常用,但可以通过TransactionTemplate或者PlatformTransactionManager接口直接编程控制事务。 在`first_maven_project`这个项目中,我们可能会看到如下配置: ```xml xmlns:xsi=...

    spring的@Transactional注解详细用法1

    声明式事务管理是Spring框架的一大特色,它通过AOP(面向切面编程)实现,使得开发者无需在业务逻辑代码中处理事务控制,而是通过配置或注解来定义事务规则。这种非侵入式的开发方式让业务代码保持简洁,降低了耦合...

    spring的@Transactional注解用法解读

    - **基于@Transactional注解**:在需要事务控制的方法上直接添加@Transactional注解,简洁且易于理解。Spring推荐使用这种方式,因为它更加直观和清爽。 2. **@Transactional注解** - **基本使用**:在方法上添加...

    注解实现声明式事务管理

    在实际应用中,通常将`@Transactional`注解添加到服务层的方法上,以便控制事务边界。例如,如果你使用的是Hibernate,还需要在配置文件中启用注解驱动的事务管理,如下: ```xml ``` 这里的`transactionManager`...

    Transactional:Spring事务性Junit测试

    声明式事务管理通过在方法上添加@Transactional注解来实现,这使得开发者无需编写事务管理代码就能控制事务。编程式事务管理则需要通过TransactionTemplate或者PlatformTransactionManager接口手动管理事务的开始、...

    test-transactional:关于spring中@Transactional注解传播属性原理的实验

    a、b方法都可以有不同的传播级别或者不加事务注解(none): required(rd), required_new(rn), never(nr), supports(ss), not_supoort(ns), mandatory(mt), nested(ne) a和b方法都可能抛异常,对于b方法抛出的异常,a...

    Spring Boot数据库事务控制.zip

    综上所述,Spring Boot的数据库事务控制是通过Spring框架的声明式事务管理实现的,通过@Transactional注解简化了事务管理。开发者需要理解事务的基本概念、Spring Boot中的事务配置以及事务的管理策略,以便在实际...

    Spring注解开发,事务控制

    本文将深入探讨Spring注解开发中的事务控制,以及如何通过注解实现事务管理。 首先,让我们理解“注解”在Spring中的角色。注解是一种元数据,允许我们在代码中嵌入信息,这些信息可以被编译器或运行时环境读取。在...

    Spring Boot的事务控制.docx

    ### Spring Boot 的事务控制 #### 一、事务的概念与重要性 事务是数据库操作的基本单元,用于确保数据的一致性和完整性。在企业级应用中,一个业务操作往往涉及多个数据库操作,例如转账业务就需要同时更新转出...

    Spring Data JPA系列4——Spring声明式事务处理与多数据源支持.doc

    在大部分涉及到数据库操作的项目里面,事务控制、事务处理都是一个无法回避的问题。Spring 框架提供了声明式事务处理机制,使得业务代码中进行事务控制操作起来非常简单。只需加个@Transactional 注解即可,大大简化...

    Spring中@Transactional用法详细介绍

    Spring中的@Transactional注解是Spring框架提供的一个核心特性,它用于声明式事务管理,使得开发者可以在不直接接触事务API的情况下,实现事务的控制。这个注解可以用在类或方法级别,来指定事务的传播行为、隔离...

    Spring事务之7种传播行1

    【Spring事务传播行为详解】 ...理解并恰当使用这些事务传播行为,可以帮助开发者更精确地控制事务边界,确保事务的一致性和可靠性。在实际开发中,应根据业务需求和方法之间的相互调用关系,选择合适的事务传播行为。

    spring基于AspectJ实现事务控制

    在Spring框架中,提供了多种事务管理方式,其中之一就是基于AspectJ的事务控制。本文将深入探讨如何在Spring中利用AspectJ实现事务控制。 首先,我们需要理解什么是AspectJ。AspectJ是一种面向切面编程(AOP)的...

Global site tag (gtag.js) - Google Analytics