情况一:如果没有在程序中手动捕获异常,如下代码事务会回滚
@Transactional(rollbackFor = { Exception.class }) public void test() throws Exception { doDbStuff1(); doDbStuff2();//假如这个操作数据库的方法会抛出异常,方法doDbStuff1()对数据库的操作会回滚。 }
如果doDbStuff2()方法抛出异常,方法doDbStuff1()对数据库的操作会回滚。
情况二:如果在程序中自已捕获异常未往外抛,如下代码事务不会回滚
@Transactional(rollbackFor = { Exception.class }) public void test() { try { doDbStuff1(); doDbStuff2();//假如这个操作数据库的方法会抛出异常,现在方法doDbStuff1()对数据库的操作 不会回滚。 } catch (Exception e) { e.printStackTrace(); } }
如果doDbStuff2()这个操作数据库的方法抛出异常,因为将异常捕获未往外抛,方法doDbStuff1()对数据库的操作不会回滚。
情况三:如果自己需要捕获异常又要返回错误时,可以参考以下做法
@Transactional(rollbackFor = { Exception.class }) public void test() { try { doDbStuff1(); doDbStuff2(); } catch (Exception e) { e.printStackTrace(); TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//就是这一句了,加上之后,如果doDbStuff2()抛了异常, //doDbStuff1()是会回滚的 return “xxx错误信息”; } }
相关推荐
例如,在一个银行系统中,如果用户想要转账,但是在转账过程中出现错误,事务回滚机制可以将数据库回滚到转账前的状态,以避免数据的不一致。 在 SpringBoot 中,我们可以使用注解方式来处理事务回滚。我们可以在...
浅谈Spring中@Transactional事务回滚及示例 @Transactional是Spring Framework中的一种事务管理机制,用于管理数据库事务。它可以使得数据库操作更加安全和可靠。本文将详细介绍@Transactional的使用场景、checked...
因此,为了确保事务回滚,你需要在`catch`块中重新抛出异常,或者在`finally`块中显式调用手动回滚的方法。特别要注意,如果`try-catch`块包含在`finally`中且在`finally`中有返回操作,那么catch中的异常会被返回...
默认情况下,如果方法抛出未检查异常(继承自RuntimeException的异常)或者TransactionException,Spring会回滚事务;否则,事务会在方法结束时提交。 ```java @Service public class UserService { @...
当@Transactional注解的方法中抛出未检查异常(继承自RuntimeException的异常)时,Spring会自动回滚事务;而对于受检异常(非RuntimeException),除非显式声明,否则事务不会回滚。这种默认行为可以帮助我们更好地...
PROPAGATION_MANDATORY--支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW--新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED--以非事务方式执行操作,如果当前...
3. **事务回滚规则**:默认情况下,如果在@Transactional注解的方法中抛出未检查异常(继承自RuntimeException的异常)或者Error,Spring会自动回滚事务。对于受检查异常(非RuntimeException),需要显式地声明需要...
- `NEVER`:始终在非事务上下文中运行,如果当前存在事务,则抛出异常。 - `NESTED`:如果当前存在事务,则创建一个嵌套事务。如果当前没有事务,则行为同`REQUIRED`。 隔离级别主要有五种,它们决定了事务之间如何...
默认情况下,如果方法抛出未检查异常(继承自`RuntimeException`的异常)或`Error`,事务将被回滚;否则,事务将在方法正常结束时提交。 3. **事务属性**:`@Transactional`注解还支持一些可选属性,如`propagation...
在传统的JDBC操作中,如果想要利用事务,通常需要手动控制事务的开启、提交或回滚等过程。例如: 1. **获取连接**:`Connection con = DriverManager.getConnection();` 2. **开启事务**:`con.setAutoCommit(false...
在Spring.NET中,我们可以利用AOP来实现这个功能,创建一个切面,该切面会在方法执行前后进行拦截,如果方法抛出异常,就调用TransactionManager的Rollback方法。 在实际应用中,我们还需要注意以下几点: 1. **...
4. **事务回滚规则**:默认情况下,如果在@Transactional注解的方法中发生未捕获的运行时异常,Spring会自动回滚事务。可以通过`rollbackFor`属性指定需要回滚的异常类型。 5. **事务配置**:在Spring XML配置文件...
- 以非事务方式执行,如果当前存在事务,则抛出异常。这用于完全避免在事务上下文中执行的操作。 7. **PROPAGATION_NESTED** - 如果当前存在事务,则创建一个嵌套事务。如果当前不存在事务,则行为类似于`...
- `NEVER`: 禁止在事务中运行,如果当前存在事务,抛出异常。 - `NESTED`: 如果当前存在事务,那么嵌套事务将在当前事务内运行;如果没有,则按REQUIRED行为进行。 3. **事务隔离机制**:事务的隔离级别定义了...
5. **事务回滚规则**:在默认情况下,如果在事务中抛出未检查异常(继承自RuntimeException的异常)或者Error,Spring会自动回滚事务。对于检查异常(非 RuntimeException 的异常),如果不显式声明,Spring不会自动...
如果抛出未检查异常(继承自`RuntimeException`的异常)或在事务配置中指定的检查异常,Spring会自动回滚事务。 在描述中的问题中,开发者可能没有在服务层的方法上正确地使用`@Transactional`注解,或者事务配置...
- **PROPAGATION_NEVER**:不允许在事务中运行,如果在事务中则抛出异常。 - **PROPAGATION_MANDATORY**:如果调用者在一个事务中,则被调用的方法也必须在事务中,否则抛出异常。 - **PROPAGATION_NESTED**:如果...
如果当前存在事务则加入,否则新建)、`SUPPORTS`(如果存在事务则加入,否则不开启新的事务)、`MANDATORY`(如果存在事务则加入,否则抛出异常)、`REQUIRES_NEW`(总是新建事务,即使外部已有事务也要挂起)、`...
* 在编写业务逻辑方法时,最好将异常一直往上抛出,由表示层处理(Struts) * spring的事务管理需要添加到业务逻辑上(事务边界的定义),不要回到Dao上 技术提示: 在编写经下代码时: *" propagation=...