老师 我想问下 关于session操作回滚 并不返回null的问题,能给解答一下吗?

来源:6-10 后台更新用户信息接口编写-1

weixin_慕尼黑8068974

2020-02-20

		// 简化Session操作的工具方法,
		    // 具有一个返回值
		    public static <T> T query(Query<T> query) {
		        // 重开一个Session
		        Session session = sessionFactory.openSession();
		        // 开启事物
		        final Transaction transaction = session.beginTransaction();

	        T t = null;
	        double b = 0;//测试用
	        try {
	            // 调用传递进来的接口,
	            // 并调用接口的方法把Session传递进去
	            t = query.query(session);

				b = 1/0; //测试用异常

	            // 提交
	            transaction.commit();
	        } catch (Exception e) {
	            e.printStackTrace();
	            //t = null; 需要这个吗?
	            // 回滚
	            try {
	                transaction.rollback();
	            } catch (RuntimeException e1) {
	                e1.printStackTrace();
	            }
	        } finally {
	            // 无论成功失败,都需要关闭Session
	            session.close();
	        }

	        return t;
	    }

老师,我想问一下,关于这个代码我测试的时候发现如果数据库操作发生异常后,回滚,但是返回的 t 并不是 null。
那外面根据判断是否是null的逻辑,是不是就走不通了?
我测试的是修改用户信息这一块。传入updateInfoModel,然后在commit之前制造一个小异常,debug会显示走回滚的路线,但是t会被抛给外部的方法赋值,这样外部判断 t 并不等于null,而数据库也没有被写入。
也就是服务器会返回修改好的card信息 但是数据库是被回滚的。
在回滚的时候 需不需要 将t = null;呢?

// 用户信息修改接口
// 返回自己的个人信息
@PUT
//@Path("") //127.0.0.1/api/user 不需要写,就是当前目录
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public ResponseModel<UserCard> update(UpdateInfoModel model) {
    if (!UpdateInfoModel.check(model)) {
        return ResponseModel.buildParameterError();
    }

    User self = getSelf();
    // 更新用户信息
    self = model.updateToUser(self);
    self = UserFactory.update(self);
    // 构架自己的用户信息
    UserCard card = new UserCard(self, true);
    // 返回
    return ResponseModel.buildOk(card);
}

self = UserFactory.update(self);调用修改方法后,没有进行self是否==null的判断,这里会不会出现异常呢?
就如上所说,出现了异常后,数据库进行了回滚,但是返回的值会是

 /**
     * 更新用户信息到数据库
     *
     * @param user User
     * @return User
     */
    public static User update(User user) {
        return Hib.query(session -> {
            session.saveOrUpdate(user);
            return user;
        });
    }

想要修改的值,并不是null,上面的self也没有进行null的判断,然后会不会就返回ok呢?

写回答

1回答

Qiujuer

2020-02-20

的确,按原理来说在异常的情况下除了回滚还应该j将T=null才是符合常理的。
但是也有这样的一种情况,有时候无论成功还是失败都希望能返回值,只是返回的值应当做一定的区分。

所以这里,其实还可以将执行回调的query方法部分,扩展一下, 除了回调执行,同时也应该支持在执行中设置一个容错值。
这样在执行的时候,如果有容错值就返回容错值,如果没有就返回null。


总的来说,你的观点是正确的,这点很赞。

1
1
weixin_慕尼黑8068974
感谢老师百忙之中的解答,爱你呦?
2020-02-20
共1条回复

手把手开发完整的即时通讯App 客户端+服务端+MVP架构

客户端+服务端+MVP架构+封装思想+主流框架

1749 学习 · 872 问题

查看课程