Spring事务相关问题
-
声明式事务@Transactional注解
-
Transactional 注解放在类级别时,表示所有该类的公共方法都配置相同的事务属性信息,所有方法都支持事务并且是只读。当类级别配置了@Transactional,方法级别也配置@Transactional,应用程序会以方法级别的事务属性信息来管理事务,方法级别的事务属性信息会覆盖类级别的相关配置信息。
-
-
Spring对事务管理的支持是怎样的?
- Spring为数据库事务管理提供了一致的编程模板,做了统一的事务抽象。不管选择Spring JDBC、Hibernate 、JPA 还是iBatis,Spring都可以用统一的编程模型进行事务管理。
- 在Spring事务管理SPI(Service Provider Interface)的抽象层主要包括3个接口,分别是PlatformTransactionManager、TransactionDefinition和TransactionStatus。
- TransactionDefinition
- String getName():获取事务对象名称。
- int getIsolationLevel():获取事务的隔离级别。 Spring的默认隔离级别是DEFAULT(默认),使用数据库默认的事务隔离级别。在大多数情况下,这等同于使用READ_COMMITTED级别。
- int getPropagationBehavior():获取事务的传播行为。
- int getTimeout():获取事务的超时时间。
- boolean isReadOnly():获取事务是否只读。
用于描述事务的隔离级别、超时时间、是否只读以及事务传播规则等控制事务具体行为的属性,这些事务属性可以通过XML配置或注解描述,也可以通过手工编程的方式设置。进行事务配置时,必须配置详情。spring将配置项封装到该对象实例。
- PlatformTransactionManager是 Spring 提供的平台事务管理器,根据TransactionDefinition提供的事务属性配置信息,创建事务。该接口中提供了三个事务操作方法:
- TransactionStatus getTransaction(TransactionDefinition definition):用于获取事务状态信息。项目中Spring 将 xml 中配置的事务详细信息封装到TransactionDefinition 对象中,通过事务管理器的 getTransaction() 方法获得事务的状态(TransactionStatus),并对事务进行下一步的操作。
- void commit(TransactionStatus status):用于提交事务。
- void rollback(TransactionStatus status):用于回滚事务。
- TransactionStatus表示事务的状态,它描述某一时间点上事务的状态信息。例如:是否有保存点,事务是否完成等。
-
-
-
-
-
名称 说明 void flush() 刷新事务 boolean hasSavepoint() 获取是否存在保存点 boolean isCompleted() 获取事务是否完成 boolean isNewTransaction() 获取是否是新事务 boolean isRollbackOnly() 获取是否回滚 void setRollbackOnly() 设置事务回滚
-
-
-
-
-
- TransactionDefinition
- 在事务管理过程中,传播行为可以控制是否需要创建事务以及如何创建事务,默认是required。
- 通常情况下,数据的查询不会改变原数据,所以不需要进行事务管理,而对于数据的增加、修改和删除等操作,必须进行事务管理。
-
Spring事务是怎么实现的?
-
Spring事务有哪些传播行为?
- 当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。比如方法A有事务支持,方法B也有事务支持,在A方法中调用B方法时,B方法的事务是用A的事务还是创建新的事务,由事务传播行为控制。
- 有以下7种事务传播行为:
- PROPAGATION_REQUIRED, required , 必须支持当前事务,A如果有事务,B将使用该事务。如果A没有事务,B将创建一个新的事务。
- PROPAGATION_SUPPORTS,supports ,支持支持当前事务,A如果有事务,B将使用该事务。如果A没有事务,B将以非事务执行。
- PROPAGATION_MANDATORY,mandatory ,强制支持当前事务,A如果有事务,B将使用该事务。如果A没有事务,B将抛异常。
- PROPAGATION_REQUIRES_NEW, requires_new ,必须新的。如果A有事务,将A的事务挂起,B创建一个新的事务;如果A没有事务,B创建一个新的事务
- PROPAGATION_NOT_SUPPORTED,not_supported ,不支持。如果A有事务,将A的事务挂起,B将以非事务执行如果A没有事务,B将以非事务执行
- PROPAGATION_NEVER,never,从不。如果A有事务,B将抛异常;如果A没有事务,B将以非事务执行
- PROPAGATION_NESTED,nested,嵌套。A和B底层采用保存点机制,形成嵌套事务。
- 参考链接
-
Spring事务传播机制,多个事务方法互相调用时,事务如何在这些方法间传播
- 事务的传播性一般用在事务嵌套的场景,比如一个事务方法里面调用了另外一个事务方法,那么两个方法是各自作为独立的方法提交还是内层的事务合并到外层的事务一起提交,这需要事务传播机制的配置来确定。
- 参考连接
-
Spring事务失效的场景有哪些?
-
Spring事务与数据库事务之间的关系
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术