知识拓展之Spring事务
1. 事务的概述
事务(TRANSACATION)是作为单个逻辑工作单元的一系列SQL操作,这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行。如果任何一个SQL操作失败,那么整个操作就能失败,所有操作都会回滚到操作前状态,或者是上一个节点。 Spring事务是指在Spring框架中对数据库操作的一种支持,它通过对一组数据库操作进行整体控制来保持数据的一致性和完整性。Spring事务可以保证在一组数据库操作执行时,要么所有操作都执行成功,要么所有操作都回滚到之前的状态,避免了数据不一致的情况。
2.事务的分类
Spring事务主要分为两类:
-
编程式事务
编程式事务需要在代码中手动控制事务的开始、提交和回滚等动作。
Spring编程式事务需要在代码中获取事务管理器,并通过该事务管理器获取事务对象,然后使用该事务对象来控制事务的开始、提交和回滚等操作。
- 优点:编程式事务的优点是灵活性高,可以根据具体的业务需求来灵活控制事务的行为。
- 缺点:代码冗长,可读性差,而且容易出现错误。
-
声明式事务
Spring声明式事务需要在配置文件中声明事务管理器、事务通知等元素,然后在需要使用事务的方法上添加事务切面的注解即可;Spring声明式事务也可以通过注解的方式来实现。具体来说,可以在需要使用事务的方法上添加
@Transactional
注解,并通过该注解的属性来指定事务的传播机制、隔离级别、超时时间等信息。
3. 事务的参数详解
@Transactional
注解的常用参数包括:
value
:该属性可以用来指定事务管理器的名称,如果只有一个事务管理器,则可以省略该属性。propagation
:该属性用于指定事务的传播机制,包括REQUIRED
、SUPPORTS
、MANDATORY
、REQUIRES_NEW
、NOT_SUPPORTED
、NEVER
和NESTED
共7种。isolation
:该属性用于指定事务的隔离级别,包括DEFAULT
、READ_UNCOMMITTED
、READ_COMMITTED
、REPEATABLE_READ
和SERIALIZABLE
共5种。timeout
:该属性用于指定事务的超时时间,单位为秒,默认值为-1,表示没有超时限制。readOnly
:该属性用于指定事务是否为只读事务,默认值为false,表示事务可读可写。rollbackFor
:该属性用于指定事务回滚的条件,如果出现指定的异常类型,则事务会回滚。noRollbackFor
:该属性用于指定事务不回滚的条件,如果出现指定的异常类型,则事务不会回滚。
4. 事务的传播级别
5. Spring 事务失效情况:
Spring的声明式事务注解可能失效的情况包括:
- 注解被错误地放置在了类上而不是方法上。
- 方法是private或final的,而且它们不能从外部调用。
- 方法没有被公开暴露,也就是说,它们不是公开的方法(public)。
- 被注解的方法是静态的。
- 被注解的方法依赖于其他未被注解的方法(例如,被注解的方法调用了一个未被注解的私有方法)。
- 被注解的方法在另一个类中被调用。
- 注解被错误地配置了,例如使用了错误的名称或参数。
- 类没有被正确地扫描,因此Spring无法找到应该被注解的方法。
- 注解属性propagation设置错误
- 注解属性rollbackFor设置错误
- 异常被catch捕获导致@Transactional失效
- 数据库引擎不支持事务
- 多个切面的影响也会导致事务失效
如果遇到声明式事务注解失效的情况,需要检查上述问题并进行相应的修复。
代码规范中强调
@Transactional事务不要滥用。事务会影响数据库的QPS,另外使用事务的敌方需要考虑各方面的回滚方案,包括缓存回滚、搜索引擎、消息补偿、统计修正等。
在使用Spring事务时,需要注意对于事务的传播机制和隔离级别的设置,以及对于事务的异常处理等问题。正确地使用Spring事务可以提高系统的数据一致性和可靠性。