大神们帮忙,去了滴答拼车给的面试题,小弟我愣是没看懂,求解惑。
如下代码用spring管理,请说出代码是否有问题,如果有错请指出并修改。
classTestDao(){
public void doUpdate(){
try{
update table1;//一个更新操作,无需关注语法
update table2;//一个更新操作,无需关注语法
insert history;//一个插入操作,无需关注语法
}catch(Exception e){
logger.error(e.getMessage());
}
}
}
Class Test Service(){
@AutoWire
TestDao testDao;
@Transactional ( readOnly = false , rollbackFor = Exception.class)
public void doUpdate(){
try{
testDao.doUpdate();
}catch(Exception e){
logger.error(e.getMessage());
}
}
}
问题1:Service的doUpdate方法配置为在接收到Exception类的异常时会执行回滚操作,但从代码看,TestDao和Service的doUpdate方法都不会抛出异常,所以内部异常时,spring没有感知,自然无法回滚。
问题2:代码中记录异常的方法不太好,只记录了异常名称,但丢弃了异常的栈,项目进行运营阶段后遇到问题可能不太好定位。
classTestDao(){ 这里 class TestDao(){
@Transactional ( readOnly = false , rollbackFor = Exception.class)这个应该写在TestDao类里吧
1、在service类前加上@Transactional,声明这个service所有方法需要事务管理。每一个业务方法开始时都会打开一个事务。
Spring默认情况下会对运行期例外(RunTimeException)进行事务回滚。这个例外是unchecked
如果遇到checked意外就不回滚。
如何改变默认规则:
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)
2 让unchecked例外不回滚: @Transactional(notRollbackFor=RunTimeException.class)
3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED)
注意: 如果异常被try{}catch{}了,事务就不回滚了,如果想让事务回滚必须再往外抛try{}catch{throw Exception}。
2、
class TestDao()里面的 doUpdate()不应该放那么多方法
应该是每一个更新、插入的的操作都写一个方法。
然后在service层里来一一调用,
另外,最好把dao层和service层都加上自动注解,@repository和@service
所以你这里没有抛出异常啊throw Exception。所以事务不会回滚的!!!!!!!!!!
让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)