声明式事物管理虽然十分方便,但是也有失效的情形:
1.@Transactional作用在非public方法上
Spring的事物管理只支持使用public声明的方法,即使是在同一个包或者同一个类中的方法事务管理也会失效
package com.ffyc.springdemo.service;
import com.ffyc.springdemo.dao.AdminDao;
import com.ffyc.springdemo.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AdminService {
@Autowired
AdminDao adminDao;
@Transactional(rollbackFor = Exception.class)
void zhuanZhang(){ //@Transactional作用在非public方法上
adminDao.sub();
System.out.println(10/0);
adminDao.add();
}adminDao.update();
}
}
2.所处方法中的异常被try catch捕获处理
若是作用方法中含有try catch语句并且捕获处理了方法中的异常,这样Spring就会无法找到异常从而导致事务管理失效
package com.ffyc.springdemo.service;
import com.ffyc.springdemo.dao.AdminDao;
import com.ffyc.springdemo.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.UnsupportedEncodingException;
@Service
@Transactional(rollbackFor = Exception.class)
public class AdminService {
@Autowired
AdminDao adminDao;
public void zhuanZhang(){
adminDao.sub();
try { //使用try catch捕获异常代码
"abc".getBytes("utf-99");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
adminDao.add();
}
}
3.出现编译期异常
Spring事物管理默认只识别运行期异常,对于编译期异常Spring默认不处理,因此导致Spring事物管理失效
package com.ffyc.springdemo.service;
import com.ffyc.springdemo.dao.AdminDao;
import com.ffyc.springdemo.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.UnsupportedEncodingException;
@Service
@Transactional(rollbackFor = Exception.class)
public class AdminService {
@Autowired
AdminDao adminDao;
public void zhuanZhang() throws UnsupportedEncodingException {
adminDao.sub();
"abc".getBytes("utf-99");
adminDao.add();
}
}
我们可以手动设置使Spring事务管理识别所有异常:
@Transactional(rollbackFor = Exception.class)
我们通过设置rollback为Exception.class可以设置让Spring识别所有的异常,从而可以将任何异常都列入事务管理.
4.@Transactional事务传播行为设置错误
事务传播行为我们在下篇博客详细介绍
5.数据库引擎不支持事务管理
在MySQL中只有InnoDB引擎支持事物管理,其他的引擎均不支持事物管理,因此我们要想使用Spring的事物管理操作数据库,在MySQL中就必须保证此数据库的引擎为InnoDB引擎
6.同一个类中,使用非代理对象调用一个有事务管理的方法
在Spring事务管理中,我们必须使用代理对象调用另一个代理对象,否则Spring无法帮我们找到所需管理的事务
package com.ffyc.springdemo.service;
import com.ffyc.springdemo.dao.AdminDao;
import com.ffyc.springdemo.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AdminService {
@Autowired
AdminDao adminDao;
public void zz(){
this.zhuanZhang(); //使用非代理对象调用一个有事务的方法
}
@Transactional(rollbackFor = Exception.class)
public void zhuanZhang(){
adminDao.sub();
System.out.println(10/0);
adminDao.add();
}
}