1 Spring事务是干什么的,解决了什么
Spring事务其实准备来讲叫Spring事务管理,拿mysql来说,事务已在其默认引擎innodb中实现了,我们是通过它提供的sql指令去开启事务、提交/回滚事务。
那么有的疑问是什么呢? 事务不是数据库去管理的吗为什么还需要Spring
数据库确实有自己的事务管理机制。然而,使用Spring事务管理的好处在于它提供了一种更加灵活和方便的方式来处理事务,特别是在大型应用程序中或者跨多个数据源的情况下。
数据库默认事务管理和代码事务管理是两种不同的事务管理方式,它们在实现和使用上有所不同。
1. 数据库默认事务管理:
- 在数据库默认的事务管理中,事务是由数据库管理器自动启动和管理的。
- 通常情况下,每个 SQL 语句都被视为一个单独的事务,即每个语句都会被立即提交,除非显式地开启事务并在适当的时候提交或回滚事务。
- 这种方式通常通过数据库的事务控制语句(如 `START TRANSACTION`、`COMMIT`、`ROLLBACK`)来实现,它们是由数据库提供的命令。
2. 代码层面去做事务管理而不是默认的处理方式:
你可以通过编程方式指定事务的开始、提交和回滚,而不是依赖于数据库的默认行为。
你可以显式地使用 START TRANSACTION
命令来开始一个事务,然后使用 COMMIT
或 ROLLBACK
命令来提交或回滚事务。当你使用事务时,多个 SQL 语句可以作为一个原子操作一起执行作为一个事务(数据库默认的每个 SQL 语句都被视为一个单独的事务),这意味着它们要么全部执行成功提交,要么全部回滚。
- 代码事务管理通常提供了更大的灵活性和控制力,允许你根据具体需求定义事务的范围、传播行为、隔离级别等属性。
- Spring 框架就提供了强大的代码事务管理功能,可以通过注解或编程方式来定义事务,而不需要直接依赖于数据库的事务控制语句。
总的来说,数据库默认事务管理依赖于数据库的事务控制语句和默认行为,而代码事务管理通过编程语言或框架提供的功能来实现更灵活的事务管理。在选择使用哪种方式时,你可以根据具体情况和需求进行选择。
理解 Spring 事务需要从 Spring 框架对事务管理的支持入手。Spring 框架提供了一种简单而强大的方式来处理事务,同时隐藏了底层事务管理的复杂性。
以下是理解 Spring 事务的关键点:
1. 声明式事务管理 vs. 编程式事务管理:
- Spring 支持声明式事务管理和编程式事务管理两种方式。
- 声明式事务管理允许通过注解或 XML 配置来定义事务行为,将事务管理逻辑从业务逻辑中分离出来。
- 编程式事务管理则允许在代码中直接控制事务的开启、提交和回滚。
2. 事务传播行为:
- Spring 定义了多种事务传播行为,用于指定方法调用时事务的行为,如 REQUIRED、REQUIRES_NEW、NESTED 等。
- 通过事务传播行为,你可以控制事务的范围和行为,以满足不同的业务需求。
3. 事务隔离级别:
- Spring 允许你指定事务的隔离级别,以控制事务之间的相互影响程度,如 READ_COMMITTED、REPEATABLE_READ 等。
- 事务隔离级别定义了事务对并发读取和修改的数据的可见性。
4. 异常处理与事务回滚:
- Spring 具有强大的异常处理机制,允许你将特定类型的异常映射到事务回滚。
- 如果在事务内发生异常,Spring 会自动回滚事务,确保数据的一致性。
5. 多数据源支持:
- Spring 支持在同一个事务中操作多个数据源,使得跨多个数据库的事务操作变得更加简单。
总的来说,理解 Spring 事务就是理解 Spring 框架如何简化和增强对事务管理的支持。通过 Spring 的事务管理机制,你可以更轻松地管理事务,并且保持代码的清晰和可维护性。
总的来说,理解 Spring 事务就是理解 Spring 框架如何简化和增强对事务管理的支持。通过 Spring 的事务管理机制,你可以更轻松地管理事务,并且保持代码的清晰和可维护性。
2 Spring事务传播行为:
3 Spring事务隔离级别和数据库的事务隔离级别有什么区别:
Spring事务隔离级别是在数据库隔离级别之上又进一步进行了封装。
Spring事务由 @Transactional 注解实现,隔离级别由它的参数 isolation 控制,Isolation 的 Eum 类中定义了“五个”表示隔离级别的值,如下。
Isolation.DEFAULT 是 PlatfromTransactionManager 默认的隔离级别,它的含义是:使用数据库默认的事务隔离级别。
不一致会怎样
既然是封装,那么Spring项目应该就是以Spring事务为准的,除非使用 @Transactional(isolation = Isolation.DEFAULT)时,才会使用数据库设置的隔离级别。
4 Spring事务实现原理
使用AOP实现的,对使用事务注解的方法做增强
1 创建代理对象:在运行时,Spring 使用 AOP 动态地为目标对象创建一个代理对象。
2 方法执行时添加事务:当业务方法被调用时,代理对象会检查事务通知,如果该方法需要进行事务管理,则在方法执行前开启一个事务。
3 提交或回滚事务:在方法执行完毕后,代理对象根据方法的执行情况(成功或失败)来决定是否提交或回滚事务。