首页 > 试题广场 >

下列关于@Transactional注解的说法中,错误的是(

[单选题]
下列关于@Transactional注解的说法中,错误的是(   )
  • @Transactional可以作用在类上,代表这个类的所有方法都将启用事务。
  • 可以通过@Transactional的propagation属性,指定事务的传播行为。
  • 可以通过@Transactional的isolation属性,指定事务的隔离级别。
  • 可以通过@Transactional的rollbackFor属性,指定发生哪些异常时回滚。
推荐
@Transactional可以作用在类上,代表这个类的所有公共非静态方法都将启用事务。
编辑于 2021-10-15 15:00:33 回复(4)
A   在spring中有两种事务的实现方式,分别是编程式事务管理和编码式事务管理。
编程式事务一般使用的是TransactionTemplate工具类来实现
spring中使用的是@Transactional注解,可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性。

参数描述:

readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})
rollbackForClassName 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:指定单一异常类名称@Transactional(rollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,”Exception”})
noRollbackFor 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})
noRollbackForClassName 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:指定单一异常类名称:@Transactional(noRollbackForClassName=”RuntimeException”)指定多个异常类名称:@Transactional(noRollbackForClassName={“RuntimeException”,”Exception”})
propagation 该属性用于设置事务的传播行为。例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)
isolation 该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置
timeout 该属性用于设置事务的超时秒数,默认值为-1表示永不超时

我们可以使用propagation 来对事务的传播行为进行声明式的设定
REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。    

NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。     

REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。     

MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。     

SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。     

NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。     

NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。 

事务的隔离级别
隔离级别指的是若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:
TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。

TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读,不可重复读和幻读,因此很少使用该隔离级别。比如PostgreSQL实际上并没有此级别。

TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。

TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。该级别可以防止脏读和不可重复读。

TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。



发表于 2022-01-04 16:55:36 回复(45)
spring的事务实现依赖于aop,只有在public方法上才会生效
发表于 2021-11-13 08:10:37 回复(0)
spring事务有时会失效, 1、bean对象没有被spring容器管理 2、方法的访问修饰符不是public,所以方法必须是public修饰 3、自身调用问题 4、数据源没有配置事务管理器 5、数据库不支持事务 6、异常被捕获 7、异常类型错误或者配置错误
发表于 2022-03-07 23:41:32 回复(12)
用排除法做的,B,C,D中该注解的属性描述是正确的,因此选择A
发表于 2022-08-02 17:58:18 回复(0)
@Transactional 无法为静态方法开启事务
发表于 2023-10-12 20:29:30 回复(0)
@transaction注解可以作用在类和方法上,作用在类上,代表这个类所有的公共非静态方法启用事务
属性:1、value :起名字
2、propagation :事务的传播特性 默认required
3、isolation :事务的隔离级别 默认default 数据库可能不同采用默认
4、readonly :只读 默认false true的话不能对数据库进行操作
5、timeout : 超时时间,超时回滚
6、rollback : 指定异常回滚
发表于 2023-09-04 10:20:26 回复(0)
@RequestParam是用来将请求参数和方法内的形参绑定用的,@PathVariable是用来获取路径中{}的值
发表于 2022-05-20 21:34:22 回复(0)
@transaction作用的类必须是public类型的才能做到所有类的方法都开启事务
发表于 2022-03-13 22:29:53 回复(1)
@Transactional只能作用在public上才生效
发表于 2022-05-21 17:08:04 回复(0)
@transaction作用的类必须是public类型的才能做到所有类的方法都开启事务
发表于 2022-05-15 16:54:23 回复(0)
spring的事务实现依赖于aop,只有在public方法上才会生效
发表于 2022-04-06 21:56:00 回复(0)
REQUIRED:业务方法需要在一个容器里运行。如果方法运行时,已经处在一个事务中,那么加入到这个事务,否则自己新建一个新的事务。     NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为他开启事务,如果方法在一个事务中被调用,该事务会被挂起,调用结束后,原先的事务会恢复执行。      REQUIRESNEW:不管是否存在事务,该方法总汇为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务挂起,新的事务被创建。      MANDATORY:该方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果在没有事务的环境下被调用,容器抛出例外。      SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。      NEVER:该方法绝对不能在事务范围内执行。如果在就抛例外。只有该方法没有关联到任何事务,才正常执行。      NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中。如果没有活动事务,则按REQUIRED属性执行。它使用了一个单独的事务,这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
发表于 2022-03-20 10:18:00 回复(0)
A错误的原因是:
Spring AOP 是通过 动态代理机制(JDK 或 CGLIB)在运行时生成代理对象拦截目标方法调用,从而在方法执行前后织入增强逻辑。
接口中的静态方法不能被子类重写,也无法被 Spring AOP 增强;default 方法可以被子类覆盖,Spring AOP 可以增强 default 方法(只要是 public 实例方法);

那私有方法和静态方法都不能被重写,那怎么增强呢 所以只能对类中的public方法和接口中的default方法(前提是:实现类没有重写该默认方法时,默认实现生效)
发表于 2025-05-17 13:57:18 回复(0)
spring事务有时会失效, 1、bean对象没有被spring容器管理 2、方法的访问修饰符不是public,所以方法必须是public修饰 3、自身调用问题 4、数据源没有配置事务管理器 5、数据库不支持事务 6、异常被捕获 7、异常类型错误或者配置错误
发表于 2024-08-21 21:08:28 回复(0)
1、A选项:@Transactional可以作用在类上,代表这个类的所有公共非静态方法都将启用事务。
发表于 2022-09-22 20:31:59 回复(0)
@Transactional可以作用在类上,表示这个类中所有的公共非静态的方法都讲启用事务
发表于 2022-07-04 22:51:40 回复(0)