首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring @Transactional方法和类

Spring @Transactional是Spring框架中的一个注解,用于标记事务性方法和类。它可以应用于方法级别和类级别。

在方法级别上,@Transactional注解可以应用于任何公共方法上,以指示该方法应该在事务中执行。当方法被调用时,Spring会自动创建一个事务,并在方法执行完毕后提交或回滚事务。如果方法抛出一个未检查异常,则事务将回滚;否则,事务将提交。

在类级别上,@Transactional注解可以应用于整个类,以指示该类中的所有公共方法都应该在事务中执行。这意味着类中的每个方法都将受到事务管理的影响。

使用@Transactional注解的优势包括:

  1. 简化事务管理:通过使用注解,可以避免手动编写事务管理代码,减少了重复的劳动。
  2. 提高代码可读性:通过在方法或类级别上添加注解,可以清楚地表达该方法或类是事务性的,提高了代码的可读性和可维护性。
  3. 提供灵活的事务控制:@Transactional注解提供了各种属性,可以根据需要进行配置,例如事务的传播行为、隔离级别、只读属性等。

Spring提供了多个与事务相关的注解,例如:

  • @Transactional(propagation = Propagation.REQUIRED):指定事务的传播行为为REQUIRED,表示如果当前存在事务,则加入该事务,否则创建一个新事务。
  • @Transactional(isolation = Isolation.READ_COMMITTED):指定事务的隔离级别为READ_COMMITTED,表示读取已提交的数据。
  • @Transactional(readOnly = true):指定事务为只读事务,可以提高性能。

Spring Cloud Tencent(腾讯云)提供了一系列与云计算相关的产品,例如:

  • 云服务器(CVM):提供可扩展的计算能力,用于部署应用程序和托管数据库。
  • 云数据库 MySQL:提供高可用性、可扩展性和安全性的关系型数据库服务。
  • 云对象存储(COS):提供高可靠性、低成本的对象存储服务,用于存储和访问大规模的非结构化数据。
  • 云函数(SCF):无服务器计算服务,用于按需运行代码,无需管理服务器。
  • 人工智能机器学习平台(AI Lab):提供丰富的人工智能算法和模型,用于构建和训练机器学习模型。

更多关于腾讯云产品的信息,请访问腾讯云官方网站:https://cloud.tencent.com/

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring 事务失效?看这篇文章就够了!

数据库引擎不支持事务 这里以 MySQL 为例,其 MyISAM 引擎是不支持事务操作的,InnoDB 才是支持事务的引擎,一般要支持事务都会使用 InnoDB。 根据 MySQL 的官方文档: https://dev.mysql.com/doc/refman/5.5/en/storage-engine-setting.html 从 MySQL 5.5.5 开始的默认存储引擎是:InnoDB,之前默认的都是:MyISAM,所以这点要值得注意,底层引擎不支持事务再怎么搞都是白搭。 没有被 Spring 管理 如下面例子所示: // @Service public class OrderServiceImpl implements OrderService { @Transactional public void updateOrder(Order order) { // update order } } 如果此时把 @Service 注解注释掉,这个类就不会被加载成一个 Bean,那这个类就不会被 Spring 管理了,事务自然就失效了。 方法不是 public 的 以下来自 Spring 官方文档: When using proxies, you should apply the @Transactional annotation only to methods with public visibility. If you do annotate protected, private or package-visible methods with the @Transactional annotation, no error is raised, but the annotated method does not exhibit the configured transactional settings. Consider the use of AspectJ (see below) if you need to annotate non-public methods. 大概意思就是 @Transactional 只能用于 public 的方法上,否则事务不会失效,如果要用在非 public 方法上,可以开启 AspectJ 代理模式。 自身调用问题 来看两个示例: //示例1 @Service public class OrderServiceImpl implements OrderService { public void update(Order order) { updateOrder(order); } @Transactional public void updateOrder(Order order) { // update order } } //示例2 @Service public class OrderServiceImpl implements OrderService { @Transactional public void update(Order order) { updateOrder(order); } @Transactional(propagation = Propagation.REQUIRES_NEW) public void updateOrder(Order order) { // update order } }

04

spring的事物配置 原

xml配置这里不细说了,这里主要讲的是注解方式。     需要注意的是:        @Transactional只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.     Spring使用声明式事务处理,默认情况下,如果被注解的数据库操作方法中发生了unchecked异常,所有的数据库操作将rollback;如果发生的异常是checked异常,默认情况下数据库操作还是会提交的。这种默认的行为是可以改变的。 使用@Transactional注解的noRollbackFor和rollbackFor属性。 如:@Transactional(rollbackFor=Exception.class)可以使checked异常发生时,数据库操作也rollback、@Transactional(noRollbackFor=RuntimeException.class)可以使unchecked异常发生时也提交数据库操作。也可以使用noRollbackForClassName、rollbackForClassName属性来指定一个异常类名的String数组来改变默认的行为。 另外此注解要是只在接口上写, 接口的实现类就会继承下来、接口的实现类的具体方法,可以覆盖类声明处的设置  。     @Transactional  的所有可选属性如下:

01

spring的@Transactional(rollbackFor=Exception.class)的使用

Spring框架的事务基础架构代码将默认地只在抛出运行时和unchecked exceptions时才标识事务回滚。 也就是说,当抛出个RuntimeException 或其子类例的实例时。(Errors 也一样 - 默认地 - 标识事务回滚。)从事务方法中抛出的Checked exceptions将不被标识进行事务回滚。 1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class) 3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED) 注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。 注意:     Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。因为注解是不能继承的,这就意味着如果你正在使用基于类的代理时,那么事务的设置将不能被基于类的代理所识别,而且对象也将不会被事务代理所包装(将被确认为严重的)。因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。     @Transactional 注解标识的方法,处理过程尽量的简单。尤其是带锁的事务方法,能不放在事务里面的最好不要放在事务里面。可以将常规的数据库查询操作放在事务前面进行,而事务内进行增、删、改、加锁查询等操作。

01
领券