34911 分析shopnc代码中hibernate数据更新失败问题

问题现象:

        更新orders表中confirm_time字段,方法能成功返回,能查出修改后的数据,且无任何异常。但是方法调用结束后,数据库中confirm_time字段仍然为null值。

问题分析:

     1,断点至543行, 即执行过537行的更新confirm_time操作后,如下图所示:

 

2,查看数据库中confirm_time; PS:这里要把数据库的事务隔离级别设置为 READ UNCOMMITTED ;即可以读到代码中未提交的事务的数据。 如下图:这个时候我们可以看到:confirm_time已经有值。


3,代码执行完成后,数据库confirm_time仍为空。那么数据为何没有保存成功呢?

   

分析可能原因:1,该代码中没有加入事务,导致数据没有提交入库。看了下代码,存在声明式的事务注解。排除该原因。

             2,代码中出现了异常,导致事务回滚。整个断点调试的过程中并没有catch到任何异常,也排除。

3,数据更新后被其他更新操作覆盖了,好像是这个原因。分析如下:  

在511行中,从数据库获取到ordersInfo;这个是数据库表映射对象。虽然537行成功更新了confirm_time;但是此时ordersInfo中的confirm_time仍为null;该类头上加了事物注解;

send方法结束后,ordersInfo被最终更新到数据库中,confirm_time此时被覆盖为空。

 

后续验证中添加ordersInfo.setConfirmTime(ShopHelper.getCurrentTimestam)后。confirm_time成功保存了。证明确实是这个原因。

 

附带hibernateLockMode(悲观锁和乐观锁)学习分享:


这里设置为UPGRADE_NOWAIT主要是避免在缓存中查询订单信息。保证查出来的订单信息是数据库中最新的。

锁定模式

描述

LockMode.NONE

 

如果缓存中存在对象,直接返回该对象的引用,否则通过select语句到数据库中加载该对象,默认值.

LockMode.READ

 

不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否和数据库中对象版本一致

LockMode.UPGRADE

 

不管缓存中是否存在对象,总是通过select语句到数据库中加载该对象,如果映射文件中设置了版本元素,就执行版本检查,比较缓存中的对象是否和数据库中对象的版本一致,如果数据库系统支持悲观锁(Oracle/MySQL),就执行select...forupdate语句,如果不支持(Sybase),执行普通select语句

LockMode.UPGRADE_NOWAIT

 

LockMode.UPGRADE具有同样功能,此外,对于Oracle等支持update nowait的数据库,执行select...for update nowait语句,nowait表明如果执行该select语句的事务不能立即获得悲观锁,那么不会等待其它事务释放锁,而是立刻抛出锁定异常

LockMode.WRITE

 

保存对象时会自动使用这种锁定模式,仅供Hibernate内部使用,应用程序中不应该使用它

LockMode.FORCE

 

强制更新数据库中对象的版本属性,从而表明当前事务已经更新了这个对象

目录 1 平台管理 - 1 - 1.1 登录 - 1 - 1.2 平台导航 - 1 - 1.3 设置 - 3 - 1.3.1 站点设置 - 3 - 1.3.2 账号同步 - 4 - 1.3.3 上传设置 - 6 - 1.3.4 SEO设置 - 9 - 1.3.5 邮箱短信 - 9 - 1.3.6 支付方式 - 11 - 1.3.7 权限设置 - 12 - 1.3.8 快递公司 - 13 - 1.3.9 运单模板 - 14 - 1.3.10 地区管理 - 15 - 1.3.11 配送区域 - 16 - 1.3.12 清理缓存 - 16 - 1.4 商品 - 17 - 1.4.1 商品分类 - 17 - 1.4.2 品牌管理 - 18 - 1.4.3 商品管理 - 19 - 1.4.4 类型管理 - 21 - 1.4.5 规格管理 - 23 - 1.4.6 图片空间 - 25 - 1.5 店铺 - 25 - 1.5.1 店铺管理 - 25 - 1.5.2 店铺等级 - 27 - 1.5.3 店铺分类 - 28 - 1.5.4 二级域名 - 28 - 1.5.5 店铺动态 - 29 - 1.5.6 店铺帮助 - 30 - 1.5.7 开店首页 - 32 - 1.5.8 自营店铺 - 33 - 1.6 会员 - 34 - 1.6.1 会员管理 - 34 - 1.6.2 会员级别 - 35 - 1.6.3 经验值管理 - 36 - 1.6.4 积分管理 - 37 - 1.6.5 预存款管理 - 37 - 1.6.6 分享绑定 - 38 - 1.6.7 会员相册 - 39 - 1.6.8 买家动态 - 39 - 1.6.9 聊天记录 - 41 - 1.7 交易 - 41 - 1.7.1 实物订单 - 41 - 1.7.2 虚拟订单 - 42 - 1.7.3 退款管理 - 43 - 1.7.4 退货管理 - 43 - 1.7.5 虚拟订单退款 - 44 - 1.7.6 咨询管理 - 44 - 1.7.7 举报管理 - 45 - 1.7.8 评价管理 - 47 - 1.7.9 投诉管理 - 47 - 1.8 网站 - 50 - 1.8.1 文章分类 - 50 - 1.8.2 文章管理 - 50 - 1.8.3 会员协议 - 52 - 1.8.4 页面导航 - 52 - 1.8.5 广告管理 - 53 - 1.8.6 首页管理 - 55 - 1.8.7 推荐位 - 59 - 1.8.8 友情连接 - 60 - 1.9 运营 - 60 - 1.9.1 基本设置 - 60 - 1.9.2 抢购管理 - 61 - 1.9.3 虚拟抢购设置 - 61 - 1.9.4 限时折扣 - 62 - 1.9.5 满即送 - 63 - 1.9.6 优惠套装 - 65 - 1.9.7 推荐展位 - 66 - 1.9.8 代金券 - 67 - 1.9.9 结算管理 - 70 - 1.9.10 虚拟订单结算 - 70 - 1.9.11 活动管理 - 70 - 1.9.12 兑换礼品 - 72 - 1.9.13 平台客服 - 75 - 1.9.14 平台充值卡 - 75 - 1.10 统计 - 76 - 1.10.1 概述及设置 - 76 - 1.10.2 行业分析 - 78 - 1.10.3 会员统计 - 81 - 1.10.4 店铺统计 - 82 - 1.10.5 销量分析 - 83 - 1.10.6 商品分析 - 85 - 1.10.7 营销分析 - 87 - 1.10.8 售后分析 - 89 - 1.11 手机端 - 89 - 1.11.1 首页编辑 - 89 - 1.11.2 分类图片设置 - 91 - 1.11.3 下载设置 - 92 - 1.11.4 意见反馈 - 92 - 1.11.5 手机支付 - 93 -
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值