当假设有一个大小为10的for循环,当执行到第二个数据的时候,出现异常,可以保证不影响已经执行已经执行的语句,以及余下的8次执行,单独catch住第二次的执行所抛出的异常。
可以使用以下的策略:
1、在一个Aservice实现类的方法里面定义一个for循环,Aservice实现类上面加上@Transactional(rollbackFor = Exception.class)注解;
2、再在这个for循环里面调用另一个Bservice的实现类方法,在Bservice的实现类的上面加上@Transactional(propagation = Propagation.REQUIRES_NEW)注解
testBatchUpdate和testUpdate一定要写在不同的文件中,否则事务是不生效的
TestTransactionServiceImpl.java
@Transactional(rollbackFor=Exception.class)
@Override
public void testBatchUpdate() {
List<User> listUser = getUserData();
List<UserInfo> listUserInfo = getUserInfoData();
for(int i=0;i<listUser.size();i++){
try{
testTransactionService1.testUpdate(listUser.get(i),listUserInfo.get(i));
}catch(Exception e){
e.printStackTrace();
}
}
}
private List<User> getUserData(){
List<User> listUser = new ArrayList<>();
User user1 = new User();
user1.setUserId("test1");
user1.setUserName("test1");
user1.setAge(20);
user1.setSex(1);
user1.setAddress("xian");
user1.setEmail("111");
User user2 = new User();
user2.setUserId("test2");
user2.setUserName("test2");
user2.setAge(20);
user2.setSex(1);
user2.setAddress("xian");
user2.setEmail("111");
User user3 = new User();
user3.setUserId("test3");
user3.setUserName("test3");
user3.setAge(20);
user3.setSex(1);
user3.setAddress("xian");
user3.setEmail("111");
listUser.add(user1);
listUser.add(user2);
listUser.add(user3);
return listUser;
}
private List<UserInfo> getUserInfoData(){
List<UserInfo> listUserInfo = new ArrayList<>();
UserInfo userInfo1 = new UserInfo();
userInfo1.setUserId("test1");
userInfo1.setUserLevel("1");
userInfo1.setEnableFlag(true);
userInfo1.setRemark("remark1");
userInfo1.setMc("mc1");
UserInfo userInfo2 = new UserInfo();
userInfo2.setUserId("test2");
userInfo2.setUserLevel("1");
userInfo2.setEnableFlag(true);
userInfo2.setRemark("remark2");
userInfo2.setMc("mc2");
UserInfo userInfo3 = new UserInfo();
userInfo3.setUserId("test3");
userInfo3.setUserLevel("111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111");
userInfo3.setEnableFlag(true);
userInfo3.setRemark("remark3");
userInfo3.setMc("mc3");
listUserInfo.add(userInfo1);
listUserInfo.add(userInfo2);
listUserInfo.add(userInfo3);
return listUserInfo;
}
TestTransactionService1Impl.java
@Transactional(rollbackFor=Exception.class,propagation = Propagation.REQUIRES_NEW)
public void testUpdate(User user,UserInfo userInfo) {
userMapper.addUserInfo(user);
userInfoMapper.addUserInfo(userInfo);
}