找回密码
 立即注册

QQ登录

只需一步,快速开始

qtcxc 活字格认证

高级会员

67

主题

355

帖子

1069

积分

高级会员

积分
1069

活字格认证

qtcxc 活字格认证
高级会员   /  发表于:2021-5-21 09:57  /   查看:5059  /  回复:12
[6.0.6]关于数据库数据命令中的"更新命令"增加当执行后影响行数为0行时判断为错误


原因是,让实现代码更简洁,目前活字格不支持以上的判断,导致需要前置做很多事情才能确保更新数据的准确性,加大了程序设计的复杂度,复杂度增高工作量也增加很多.

举一个简单的例子:
现在 需要更新一个资料的,如果更新时存在并发的情况,数据已经被别人修改了,而当前修改时的条件已经找不到原始记录,这个时候活字格仍然是执行成功状态因为现在活字格的更新动作是没有判断执行后只影响0行记录未失败的,这种情况应返回错误才对
可参考附件demo




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

12 个回复

倒序浏览
Timothy.Xu讲师达人认证 悬赏达人认证 活字格认证
论坛元老   /  发表于:2021-5-21 18:39:48
沙发
您好,这里我不是特别理解,您这个 demo 模拟的应该是两个用户对于同一条记录的更新吧?我先点击更新,数值从5变成了9,再点击更新2,此时并不存在 ID=1并且数值=5的值,所以就不会触发更新:



我理解这样子才是正常的吧?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
qtcxc活字格认证
高级会员   /  发表于:2021-5-22 09:33:52
板凳
本帖最后由 qtcxc 于 2021-5-22 09:49 编辑

是的,因为没有id=1 值为5 的记录,所以没有记录会被更新,但是程序并不会反馈执行失败,而是执行成功了.

程序并不会中断会继续执行后面的动作

如果是在一个事务中的两个update动作,则也不会因为第一个update没有任何记录被更新,而回滚事务,整个事务会继续执行,导致最终执行结果并不是预期想要的结果.
回复 使用道具 举报
qtcxc活字格认证
高级会员   /  发表于:2021-5-22 09:52:30
地板
本帖最后由 qtcxc 于 2021-5-22 09:54 编辑

例子我改了一下,做了一个服务器端事务的命令,放在更新3上了,可以参考了解这类操作会导致什么问题出现,是否有别的办法能解决,我目前没有想到

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
qtcxc活字格认证
高级会员   /  发表于:2021-5-22 10:25:01
5#
另外 也提一个额外的建议,更新数据库是否有可能实现,在原来的数值上更新类似
update 表名 set 字段=字段+1 where id=id
这样的写法,


目前这类写法都需要像 update_demo的服务器端命令那样,先将数取出来,然后再计算.然后再写入,写起来比较麻烦



本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2021-5-24 16:11:17
6#
大佬,你这个想法太奇怪了
你直接在数据库中,也是这样的效果啊,你在数据库中做一次更新,发现没有任何数据符合你的更新逻辑,数据库就会提示,0行受到影响

举个例子,校长想知道自己学习有没有一个叫做张三的学生,那做了一测查询,直接报错这个也太夸张了,可定是执行完成,告诉销售,名字叫张三的学生数为0啊
报错给人感觉好像不让我这样查询,或者这样的查询非法;事实这个肯定是一个合法的查询
回复 使用道具 举报
qtcxc活字格认证
高级会员   /  发表于:2021-5-24 19:37:14
7#
是的数据 在这种场景下 会返回影响行数是0行,过往在纯代码开发时,可以获取到这个信息,并对这种情况做异常处理,但是活字格目前没有提供这个信息,只有执行成功,无法做异常处理,程序继续执行.

需要的可以是不直接判断异常,可以直接返回影响行数由我自己写程序判断是否异常也满足我的需求.
回复 使用道具 举报
qtcxc活字格认证
高级会员   /  发表于:2021-5-24 19:39:04
8#
我描述的场景是  update  并不是 select 你举的例子,应该select 的场景,而我目前遇到困难的是update的场景.
回复 使用道具 举报
qtcxc活字格认证
高级会员   /  发表于:2021-5-24 19:41:29
9#
其实程序 可以不返回影响行数,在update 前 先select 一次判断是否有记录可以update 有才update 没有就不update ,写起来也麻烦,另外select 和 update仍然会有时间差无法保证 update 和select 执行时结果是一致的,所以最好update 的时候能返回影响的行数,便于做最终判断.
回复 使用道具 举报
Simon.hu讲师达人认证 悬赏达人认证 活字格认证
超级版主   /  发表于:2021-5-25 18:19:38
10#
这个给大家说一个黑科技
当你取完数据以后,可以count方法确定当前取出来的值有几行;(7.0已经支持)
如果是当行内容的话,以后可以直接判断内容是不是为null(此方法目前有bug,因为修复工作量较大,最晚7.1会修复该bug)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部