### 1、注解控制模式


#### 示例1：父回滚，子回滚（最常用的策略）

```java
@Component
public class UserService{
    @Transaction
    public void addUser(UserModel user){
        //....
    }
}

@Controller
public class DemoController{
    @Inject
    UserService userService; 
    
    //父回滚，子回滚
    //
    @Transaction
    @Mapping("/user/add2")
    pubblic void addUser2(UserModel user){
        userService.addUser(user); 
        throw new RuntimeException("不让你加");
    }
}
```

#### 示例2：父回滚，子不回滚

```java
@Component
public class UserService{
    @Transaction(policy = TranPolicy.requires_new)
    public void addUser(UserModel user){
        //....
    }
}

@Controller
public class DemoController{
    @Inject
    UserService userService; 
    
    //父回滚，子不回滚
    //
    @Transaction
    @Mapping("/user/add2")
    pubblic void addUser2(UserModel user){
        userService.addUser(user); 
        throw new RuntimeException("不让你加；但还是加了:(");
    }
}
```

#### 示例3：子回滚父不回滚

```java
@Component
public class UserService{
    @Transaction(policy = TranPolicy.nested)
    public void addUser(UserModel user){
        //....
        throw new RuntimeException("不让你加");
    }
}

@Controller
public class DemoController{
    @Inject
    UserService userService; 
    
    //子回滚父不回滚
    //
    @Transaction
    @Mapping("/user/add2")
    pubblic void addUser2(UserModel user){
        try{
            userService.addUser(user); 
        }catch(ex){ }
    }
}
```

#### 示例4：多数据源事务示例

```java
@Component
public class UserService{
    @Db("db1")
    UserMapper userDao;
    
    @Transaction
    public void addUser(UserModel user){
        userDao.insert(user);
    }
}

@Component
public class AccountService{
    @Db("db2")
    AccountMappeer accountDao;

    @Transaction
    public void addAccount(UserModel user){
        accountDao.insert(user);
    }
}

@Controller
public class DemoController{
    @Inject
    AccountService accountService; 
    
    @Inject
    UserService userService; 
    
    @Transaction
    @Mapping("/user/add")
    public void addUser(UserModel user){
        userService.addUser(user);     //会执行db1事务
        
        accountService.addAccount(user);    //会执行db2事务
    }
}
```

### 2、手动控制模式

#### 示例1：父回滚，子回滚

```java
@Component
public class UserService{
    public void addUser(UserModel user){
        TranUtils.execute(new TranAnno(), ()->{
            //...
        });
    }
}

@Controller
public class DemoController{
    @Inject
    UserService userService; 
    
    //父回滚，子回滚
    //
    @Mapping("/user/add2")
    pubblic void addUser2(UserModel user){
        TranUtils.execute(new TranAnno(), ()->{
            userService.addUser(user); 
            throw new RuntimeException("不让你加");
        });
    }
}
```

#### 示例2：父回滚，子不回滚

```java
@Component
public class UserService{
    
    public void addUser(UserModel user)  throws Throwable{
        TranUtils.execute(new TranAnno().policy(TranPolicy.requires_new), ()->{
            //...
        });
    }
}

@Controller
public class DemoController{
    @Inject
    UserService userService; 
    
    //父回滚，子不回滚
    //
    @Mapping("/user/add2")
    pubblic void addUser2(UserModel user){
        TranUtils.execute(new TranAnno(), ()->{
            userService.addUser(user); 
            throw new RuntimeException("不让你加；但还是加了:(");
        });
    }
}



