目录
情况i: 主方法开启事务
class ALL{
@Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@DS("order")
all(){
do sql all~1;
@DS("customer")
A.a(){
do sql 1;
// 1/0;
do sql 2;
};
@Ds("warehouse")
B.b(){
do sql 3;
// 1/0;
do sql 4;
};
do sql all~2;
}
}
all()开启了事务
A.a() 没有事务,数据源失效,访问order数据源(表不存在会报错)
B.b() 没有事务,数据源失效,访问order数据源(表不存在会报错)
情况ii: 子方开启事物
class ALL{
// @Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@DS("order")
all(){
do sql all~1;
@Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@DS("customer")
A.a(){
do sql 1;
// 1/0;
do sql 2;
};
@Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@Ds("warehouse")
B.b(){
do sql 3;
// 1/0;
do sql 4;
};
do sql all~2;
}
}
all()没有事务
A.a()是一个事务,数据源正常切换, 事务生效
B.b()是一个事务,数据源正常切换, 事务生效
相互之间没有影响
情况iii: 主方法开启事务/子方法新建事务
class ALL{
@Transaction(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
@DS("order")
all(){
do sql all~1;
try{
@Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class
@DS("customer")
A.a(){
do sql 1;
// 1/0;
do sql 2;
};
}catch(){
}
try{
@Transaction(propagation=Propagation.REQUIRES_NEW, rollbackFor = Exception.class
@Ds("warehouse")
B.b(){
do sql 3;
// 1/0;
do sql 4;
};
}catch(){
}
do sql all~2;
}
}
all()开启事物主事务
A.a()开启新的事务,数据源正常切换, 事务生效,并捕获了自己的异常,如不进行捕获,会影响主事物进行回滚
B.b()开启新的事务,数据源正常切换, 事务生效,并捕获了自己的异常,如不进行捕获,会影响主事物进行回滚
此时三个事务之间互不影响
原因:
- 开启事务的同时,会从数据库连接池获取数据库连接(一个事务只会有一个数据库连接)
- 被调用的方法,使用了@DS会做一次aop切片,但是整个事务的连接是不会发生变更的,所以调用的数据源还是order
- 要使@DS起作用需要创建一个新的事务从而获取一个新的数据库连接