java spring 面试题 找错

大神们帮忙,去了滴答拼车给的面试题,小弟我愣是没看懂,求解惑。

如下代码用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());
        }
    }
}

5个回答

问题1:Service的doUpdate方法配置为在接收到Exception类的异常时会执行回滚操作,但从代码看,TestDao和Service的doUpdate方法都不会抛出异常,所以内部异常时,spring没有感知,自然无法回滚。
问题2:代码中记录异常的方法不太好,只记录了异常名称,但丢弃了异常的栈,项目进行运营阶段后遇到问题可能不太好定位。

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

classTestDao(){ 这里 class TestDao(){
@Transactional ( readOnly = false , rollbackFor = Exception.class)这个应该写在TestDao类里吧

theo789
Metz 回复sina_2831808769: 哈哈哈
大约 5 年之前 回复
theo789
Metz 回复sina_2831808769: 哈哈哈哈哈
大约 5 年之前 回复

所以你这里没有抛出异常啊throw Exception。所以事务不会回滚的!!!!!!!!!!

让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐