HOME> 历届世界杯决赛> @Transactional 事务方法内互调用与生效场景总结

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

2025-07-16 10:06:52

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

钓鱼必备软件
【全州唯一】畹町桥被列为第八批全国重点文物保护单位