事务及SpringBoot中的事务开启

本文详细介绍了事务在数据库中的基本概念,特别是SpringBoot中的事务开启方式,包括在方法或类上使用@Transactional注解、全局事务配置以及其传播行为、隔离级别、回滚规则和超时时间的设定。
摘要由CSDN通过智能技术生成

目录

1.什么是事务?

2.事务的四大特性?

3.SpringBoot中怎样开启事务

   1.开启事务支持 

    2.在需要开启事务的方法或类上使用@Transactional

      3.通过配置类来开启全局事务


1.什么是事务?

事务是指在数据库管理系统中执行的一系列操作的逻辑单元。事务可以由一个或多个数据库操作(例如插入、更新、删除等)组成,这些操作被视为一个不可分割的工作单元。在事务中,要么所有的操作都成功执行,要么所有的操作都不执行,不会出现部分操作成功而部分操作失败的情况。

事务注解属性:

  1. 传播行为(Propagation):指定事务的传播行为,即定义了事务方法调用之间的关系。常见的传播行为包括:

    • REQUIRED:如果当前存在事务,则加入该事务;如果不存在事务,则创建一个新事务。
    • REQUIRES_NEW:无论当前是否存在事务,都创建一个新事务,并暂停当前事务(如果存在)。
    • SUPPORTS:如果当前存在事务,则加入该事务;如果不存在事务,则以非事务方式执行。
    • NOT_SUPPORTED:以非事务方式执行,如果当前存在事务,则挂起该事务。
  2. 隔离级别(Isolation Level):指定事务的隔离级别,即定义了事务之间的可见性和并发控制的程度。常见的隔离级别包括:

    • READ_UNCOMMITTED:允许读取未提交的数据,可能导致脏读、不可重复读和幻读问题。
    • READ_COMMITTED:只能读取已提交的数据,避免了脏读问题,但可能导致不可重复读和幻读问题。
    • REPEATABLE_READ:在同一个事务中多次读取数据时,保证数据的一致性,避免了脏读和不可重复读问题,但可能导致幻读问题。
    • SERIALIZABLE:最高级别的隔离级别,完全隔离事务,避免了脏读、不可重复读和幻读问题。
  3. 回滚规则(Rollback Rules):指定事务在遇到特定异常时是否回滚。可以定义多个回滚规则,每个规则可以配置一个或多个异常类型。如果事务抛出了与回滚规则匹配的异常,事务将回滚。

  4. 超时时间(Timeout):指定事务的最大执行时间。如果事务执行时间超过指定的超时时间,事务将被强制回滚。

2.事务的四大特性?

通常被称为ACID特性

  1. 原子性(Atomicity):事务被视为一个不可分割的操作单元,要么全部执行成功,要么全部不执行。如果任何一部分操作失败,整个事务将被回滚到最初状态,所有的修改都会被撤销。

  2. 一致性(Consistency):事务执行前后,数据库的状态必须保持一致。这意味着事务的操作必须满足数据库的约束和规则,以确保数据的完整性和有效性。

  3. 隔离性(Isolation):在并发环境下,多个事务可能同时执行。隔离性指的是每个事务的操作应该与其他事务相互隔离,使得每个事务都感觉不到其他事务的存在,避免了并发执行可能导致的数据不一致问题。

  4. 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中,即使在系统发生故障或重启之后也不会丢失。

事务的特点: 通过使用事务,可以保证数据库的数据一致性和完整性,同时提供并发控制和故障恢复的机制,确保数据库系统的可靠性和可用性。

3.SpringBoot中怎样开启事务

   1.开启事务支持 

在启动类中使用@EnableTransactionManagement开启事务支持

package com.cssl;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@SpringBootApplication
@EnableTransactionManagement//开启事务支持
@MapperScan("com.cssl.mapper")
public class HospitalHouApplication {

	public static void main(String[] args) {
		SpringApplication.run (HospitalHouApplication.class, args);
	}

}

    2.在需要开启事务的方法或类上使用@Transactional

              事务中的注解属性:

  1. propagation:指定事务的传播行为。可以设置为 Propagation.REQUIREDPropagation.REQUIRES_NEWPropagation.SUPPORTSPropagation.NOT_SUPPORTED 等。

  2. isolation:指定事务的隔离级别。可以设置为 Isolation.DEFAULTIsolation.READ_UNCOMMITTEDIsolation.READ_COMMITTEDIsolation.REPEATABLE_READIsolation.SERIALIZABLE 等。

  3. readOnly:指定事务是否为只读事务。如果设置为 true,则事务只能读取数据,不能修改数据。这可以用于提高性能。

  4. timeout:指定事务的超时时间,单位为秒。如果事务执行时间超过指定的超时时间,事务将被回滚。

  5. rollbackFor 和 noRollbackFor:指定事务回滚的异常类型。rollbackFor 属性用于指定需要回滚的异常类型,noRollbackFor 属性用于指定不需要回滚的异常类型。

  6. rollbackForClassName 和 noRollbackForClassName:与上述属性类似,但可以通过异常类名的字符串形式指定异常类型。

      3.通过配置类来开启全局事务

        优点: 

  • 集中配置事务管理器
  • 灵活的事务配置选项
  • 多数据源支持
  • 代码整洁性和可维护性
  • 与其他配置的集成

        创建一个AopConfig的事务配置类

@Aspect
@Configuration
public class AopConfig {


	private final static int TX_METHOD_TIME_OUT = 10;

	private static final String POITCUT_EXPRESSION = "execution(* com.test.sketelon.service.*.*(..))";
	@Autowired
	private PlatformTransactionManager platformTransactionManager;

	@Bean
	public TransactionInterceptor txadvice() {

		NameMatchTransactionAttributeSource source = new NameMatchTransactionAttributeSource ();
		Map<String, TransactionAttribute> nameMap = new HashMap<> (16);

		RuleBasedTransactionAttribute readOnlyRule = new RuleBasedTransactionAttribute ();

		readOnlyRule.setReadOnly (true);

		readOnlyRule.setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUIRED);
		RuleBasedTransactionAttribute requireRule = new RuleBasedTransactionAttribute ();

		requireRule.setRollbackRules (Collections.singletonList (new RollbackRuleAttribute (Exception.class)));
		requireRule.setPropagationBehavior (TransactionDefinition.PROPAGATION_REQUIRED);
		requireRule.setTimeout (TX_METHOD_TIME_OUT);

		nameMap.put ("add*", requireRule);
		nameMap.put ("save*", requireRule);
		nameMap.put ("insert*", requireRule);
		nameMap.put ("update*", requireRule);
		nameMap.put ("delete*", requireRule);
		nameMap.put ("remove*", requireRule);
		nameMap.put ("batch*", requireRule);
		nameMap.put ("get*", readOnlyRule);
		nameMap.put ("query*", readOnlyRule);
		nameMap.put ("find*", readOnlyRule);
		nameMap.put ("select*", readOnlyRule);
		nameMap.put ("count*", readOnlyRule);
		source.setNameMap (nameMap);
		return new TransactionInterceptor (platformTransactionManager, source);
	}


	@Bean
	public Advisor txAdviceAdvisor() {
		AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut ();
		pointcut.setExpression (POITCUT_EXPRESSION);
		return new DefaultPointcutAdvisor (pointcut, txadvice ());
	}
}

到这就完成了!!!

  • 31
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Spring Boot使用MongoDB的事务功能需要满足以下条件: 1. MongoDB版本:确保使用的是MongoDB 4.0及以上版本,因为事务功能在MongoDB 4.0才被引入。 2. Spring Boot版本:使用Spring Boot 2.2及以上版本,因为事务功能在Spring Boot 2.2才被支持。 要在Spring Boot使用MongoDB的事务功能,可以按照以下步骤进行操作: 1. 引入依赖:在`pom.xml`文件添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb-reactive</artifactId> </dependency> ``` 2. 配置MongoDB连接:在`application.properties`或`application.yml`文件配置MongoDB的连接信息,如数据库链接URL、用户名和密码等。 3. 开启事务支持:在Spring Boot的启动类上添加`@EnableTransactionManagement`注解,开启事务支持。 4. 定义事务操作:通过在方法上添加`@Transactional`注解来标记需要执行事务的方法。事务注解可以用于Service或Repository层的方法上。 ```java @Service public class UserService { @Autowired private UserRepository userRepository; @Transactional public void saveUser(User user) { userRepository.save(user); } @Transactional public void updateUser(User user) { userRepository.update(user); } } ``` 5. 调用事务方法:在其他类调用标记了`@Transactional`注解的事务方法。 需要注意的是,MongoDB的事务功能在Reactive模式下也是支持的,可以在依赖添加`spring-boot-starter-data-mongodb-reactive`,然后使用`ReactiveMongoTemplate`来执行事务操作。 以上就是在Spring Boot使用MongoDB的事务功能的基本步骤,希望对你有所帮助!如果还有其他问题,请继续提问。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值