查看spring API可知 http://www.kuqin.com/spring2.0_doc/index.html
对EJB来说,默认的行为是EJB容器在遇到系统异常
(通常指运行时异常)时自动回滚当前事务。EJB CMT遇到应用异常
(例如,除了java.rmi.RemoteException
外别的checked exception)时并不会自动回滚。默认式Spring处理声明式事务管理的规则遵守EJB习惯(只在遇到unchecked exceptions时自动回滚),但通常定制这条规则会更有用。
所以
package x.y.service;
public class DefaultFooService implements FooService {
public Foo getFoo(String fooName) {
throw new UnsupportedOperationException();
}
public Foo getFoo(String fooName, String barName) {
throw new UnsupportedOperationException();
}
public void insertFoo(Foo foo) {
throw new UnsupportedOperationException();
}
public void updateFoo(Foo foo) {
throw new UnsupportedOperationException();
}
}
(对该例的目的来说,上例中实现类(DefaultFooService
)的每个方法在其方法体中抛出UnsupportedOperationException
的做法是恰当的,我们可以看到,事务被创建出来,响应UnsupportedOperationException
的抛出,然后回滚。)
@Transactional
有关的设置
在最简单的形式下,@Transactional
指定一个接口、类、方法必须是事务性的,其默认事务语义为:read/write,PROPAGATION_REQUIRED
,ISOLATION_DEFAULT
,TIMEOUT_DEFAULT
,而且仅当遇到RuntimeException
时回滚,而不是Exception
。
改变事务设置的其他可选属性
Table 9.1. Transactional
注解的属性
属性
类型
描述
传播性
|
枚举型:Propagation
|
可选的传播性设置 (默认值:PROPAGATION_REQUIRED
) |
隔离性
|
枚举型:Isolation
|
可选的隔离性级别(默认值:ISOLATION_DEFAULT
) |
只读性
|
布尔型 |
读写型事务 vs. 只读型事务(默认值:false
,即只读型事务) |
回滚异常类(rollbackFor)
|
一组 Class
类的实例,必须是Throwable
的子类 |
一组异常类,遇到时 确保
进行回滚。默认情况下checked exceptions不进行回滚,仅unchecked exceptions(即RuntimeException
的子类)才进行事务回滚。 |
回滚异常类名(rollbackForClassname)
|
一组 Class
类的名字,必须是Throwable
的子类 |
一组异常类名,遇到时 确保
进行回滚 |
不回滚异常类(noRollbackFor)
|
一组 Class
类的实例,必须是Throwable
的子类 |
一组异常类,遇到时确保 不
回滚。 |
不回滚异常类名(noRollbackForClassname)
|
一组 Class
类的名字,必须是Throwable
的子类 |
一组异常类,遇到时确保 不
回滚 |
我们推荐你参考 @Transactional
注解的javadoc,其中详细列举了上述各项属性及其可选值。
————————————————————————————————————
通过以上可知,在spring 中运用@Transactional
注解,自己抛出异常UnsupportedOperationException会
回滚,抛Exception异常,得作相关的配置才会回滚。
分享到:
相关推荐
如果抛出了未检查异常或检查异常且在`@Transactional`注解中指定了可传播的异常类型,事务将被回滚。 例如,以下代码展示了如何在Spring Data JPA的Service层使用`@Transactional`: ```java @Service public ...
1. **默认回滚规则**:如果在`@Transactional`方法中抛出未检查异常(继承自`RuntimeException`的异常)或者`Error`,Spring将自动回滚事务。 2. **非默认回滚规则**:对于受检异常(即没有继承自`RuntimeException`...
在这个例子中,`createUser`方法被标记为事务性的,如果在方法内部抛出未捕获的异常,Spring会自动回滚事务,确保数据一致性。 Spring事务管理的工作流程大致如下: 1. **AOP代理**:Spring使用AOP(面向切面编程)...
这些异常必须在代码中显式地处理,例如使用try-catch块处理,或者给所在的方法加上throws说明,将异常抛到调用栈的上一层。checked异常继承自java.lang.Exception。 unchecked异常是指程序的逻辑错误,例如...
默认情况下,运行时异常(如`RuntimeException`)会触发回滚,而检查异常(非运行时异常)则不会。 - 可以自定义回滚规则,通过`rollbackFor`和`noRollbackFor`属性来控制。 4. **配置事务管理器** - 需要在...
如果在方法内部捕获了所有异常并重新抛出,或者返回了错误代码而非抛出异常,事务可能不会按照预期进行回滚。 5. ** propagation 设置不当**:`@Transactional`的propagation属性决定了事务如何在方法间传播。如果...
@Transactional实现原理.txt
2. 默认回滚机制:Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运行期异常(java.lang.RuntimeException 及其子类)和 Error 进行回滚。 3. 数据库引擎支持:数据库引擎要支持事务,使用 InnoDB。 ...
在Spring框架中,`@Transactional`注解是一个强大的工具,用于声明式地管理事务。它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@...
如果在没有事务的环境下被调用,容器抛出例外。 5. SUPPORTS:该方法在某个事务范围内被调用,则方法成为该事务的一部分。如果方法在该事务范围外被调用,该方法就在没有事务的环境下执行。 6. NEVER:该方法绝对不...
在使用 @Transactional 注解时,需要注意以下几点: * @Transactional 注解可以应用于类或方法上。 * 如果在类上使用 @Transactional 注解,那么该类中的所有方法都会继承该注解的属性。 * 如果在方法上使用 @...
`@Transactional`可以设置不同的属性,如`propagation`(传播行为)、`isolation`(隔离级别)、`rollbackFor`(触发回滚的异常类型)等。下面是一个声明式事务的例子: ```java @Service public class UserService...
然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用时。这是因为Spring的AOP代理机制的限制所致。 在Spring框架中,@Transactional注解是通过AOP代理来实现事务管理的。在默认情况下...
如果方法抛出异常,事务则会被回滚,以此确保事务的ACID(原子性、一致性、隔离性和持久性)特性。 在Spring中,事务管理器(如`DataSourceTransactionManager`)会确保每个事务都在一组相关操作之间保持一致。例如...
4. 异常处理:为了触发事务回滚,方法内通常会抛出未检查异常(继承自`RuntimeException`的异常)或显式指定需要回滚的检查异常。Spring默认只在遇到未检查异常时自动回滚事务,如果需要在特定检查异常下回滚,可以...
但需要注意,`@Lazy`与`@Async`和`@Transactional`一起使用时可能不会按预期工作,因为`@Lazy`可能会影响到事务和异步的处理。 总的来说,理解Spring的依赖注入机制以及`@Transactional`和`@Async`的工作原理是解决...
然而,如果`methodB`的异常没有被捕获并重新抛出,而是被忽略或者处理了,那么Spring可能无法检测到这个异常,从而不会回滚`methodA`的事务。因此,捕获并重新抛出异常是至关重要的,如示例代码所示。 此外,需要...
"Spring @Transactional 无效的解决方案" Spring框架中的@Transactional注解是用来实现事务管理的,但是有时候我们可能会遇到@Transactional注解无效的情况。在这篇文章中,我们将 introducethe 解决方案,并通过...