@Transactional 事务方法内互调用与生效场景总结

1.同一个类中 事务publicA掉非事务B B抛异常 AB事务生效(具有传播性)

@Override
	@Transactional
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		B();
 
	}
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		//促发异常
		if(3/0==1)
			System.out.println("");
	}

2.同一个类中 事务A掉非事务B A抛异常 AB事务生效

@Override
	@Transactional
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		B();
		//促发异常
				if(3/0==1)
					System.out.println("");
	}
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		
	}

3.同一个类中 事务A掉事务B A抛异常 AB事务生效

@Override
	@Transactional
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		B();
		//促发异常
		if(3/0==1)
			System.out.println("");
	}
	@Transactional
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		
	}

4.同一个类中 事务A掉事务B B抛异常 AB事务生效

@Override
	@Transactional
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		B();
		
	}
	@Transactional
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		//促发异常
		if(3/0==1)
			System.out.println("");
	}

5.同一个类中 非事务A掉事务B B抛异常 A无事务 B事务不生效

@Override
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		B();
		
	}
	@Transactional
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		//促发异常
		if(3/0==1)
			System.out.println("");
	}

6.同一个类中 非事务A掉事务B(通过注入-相当于调用不同类中的B方法) B抛异常 A无事务,B事务生效

@Override
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		userService.B();
		
	}
	@Transactional
	@Override
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		//促发异常
		if(3/0==1)
			System.out.println("");
	}

7.同一个类中 非事务A掉事务B(通过注入) A抛异常 A无事务,B不促发事务,ab数据都会增加成功

@Override
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		userService.B();
		//促发异常
				if(3/0==1)
					System.out.println("");
	}
	@Transactional
	@Override
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		
	}

8.同一个类中 事务A掉非事务B(通过注入)A或B抛异常 AB事务生效 (事务传播性)

@Transactional
	@Override
	public void A() {
		User u = new User();
		u.setAccount("test");
		u.setName("1");
		u.setMobile("12345678912");
		u.setPassword("111");
		this.save(u);
		userService.B();
		//促发异常
				if(3/0==1)
					System.out.println("");
	}
	@Override
	public void B() {
		User u1 = new User();
		u1.setAccount("test1");
		u1.setName("2");
		u1.setMobile("12345678913");
		u1.setPassword("111");
		this.save(u1);
		
	}
总结:1.事务A掉B ,AB都有事务(事务传播性)2.非事务A掉事务B,A都无事务,B只有通过注入(AOP)方式调用的时候,B的事务才生效。3.private不能加事务 4.声明式事务如果要细化,可以拆分方法
非事务A掉事务B(AOP)方式可以用xxxService xxxService = (xxxService)(AopContext.currentProxy());然后xxxService.B(),获取到xxxService的代理类,再调用事务方法,强行经过代理类,激活B事务切面。

————————————————
版权声明:本文为CSDN博主「浮生若梦l」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_32784303/article/details/126121721

你可能感兴趣的:(java,数据库,前端)