码上风云

记录精彩的程序人生

  menu
24 文章
0 浏览
2 当前访客
ღゝ◡╹)ノ❤️

浅谈事务的回滚

偶然在抖音看了个视频,说是一个实习生在写代码的时候由于事务没写好,导致,用户在转账的时候,钱没成功转到对方账户,但是自己账户却扣钱了.

姑且不论事情真假啊,现在就说说什么情况下事务会回滚:

拦截的方法有指定异常抛出,事务才会自动进行回滚!

那么,什么时候才不会回滚:

  1. @Transactional注解运用不正确,此注解没有写或者没有运用在public的方法上面,或者方法A(无@Transactional注解)调用方法B(有@Transactional注解),此时事务不生效.
  2. 在被声明式事务管理的方法内开启多线程,多线程内的方法不受事务的控制.此时需要在使用异步注解@Async的方法上再加上@Transactional,保证新线程调用的方法是有事务管理的.
  3. 事务默认对不可查异常进行回滚,那些可检查的异常并不会处理,如果要回滚需要配置.关于异常可看这篇文章java中的异常总结

举几个例子:

1.不捕捉,会回滚

@Transactional(rollbackFor=Exception.class) 
	public void test() throws Exception{
		String a="zglgo.com";
	}

2.如果异常被try{}捕捉到,那么事务管理器就无法再捕捉异常,所以就无法做出反应,事务不回滚;

public void test() throws Exception{
		try {

		} catch (Exception e) {
			e.printStackTrace();
		}
	}

3.如果异常被try{}捕捉了,我们还可以在Catch(){}中throw new RuntimeException(),手动抛出运行时异常供事务管理器捕捉;

public void test() throws Exception{
		try {

		} catch (Exception e) {
			throw new RuntimeException();
		}
	}

think twice, code once