老师 我想问下 关于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回答
-
的确,按原理来说在异常的情况下除了回滚还应该j将T=null才是符合常理的。
但是也有这样的一种情况,有时候无论成功还是失败都希望能返回值,只是返回的值应当做一定的区分。
所以这里,其实还可以将执行回调的query方法部分,扩展一下, 除了回调执行,同时也应该支持在执行中设置一个容错值。
这样在执行的时候,如果有容错值就返回容错值,如果没有就返回null。总的来说,你的观点是正确的,这点很赞。
112020-02-20
相似问题