问题跟进:
您好,和开发同事沟通了一下,这个确实是因为活字格的并发控制策略导致的
并发控制的逻辑是这样的,比如有2个人分别都访问了ID=1的详情页面,用户1和用户2看到的详情信息是相同的,然后用户1修改了一些信息,然后点击更新。这时数据库中ID=1那一行的数据就已经变成用户1更改的数据了。但是用户2不知道数据被更新了,他也修改了信息,然后点击更新,这时就会提醒用户2,不可编辑数据,因为数据已被更新。
这个情况是合理的。那么活字格是怎么控制并发这种情况呢?首先活字格并发控制的是当前行,就是说多个用户改的同一行,会有控制。实现就是用户访问时,都会将当前行记一个标记,比如上面那个情况,用户1和用户2都访问详情信息页时,都会有一个相同的标记,比如V1,当用户1修改数据,更新之后,数据库ID=1这一行标识就变成了另外一个,比如V2, 用户1由于更新了数据,页面上的标记也会同步更新成V2。注意,用户1中页面标识也会同步更新为V2,前提是更新数据,更新的是当前行。用户2进行更新数据时,会先进行标识比较,对比之后发现用户2的标识是V1,但是数据库中标识已经是V2, 说明用户2的已经是老数据,不能更新,所以会弹提示。
demo中,是同样的道理,弹出排序页面时,当前行标识是V1,但是页面加载命令中,循环了表格更新了特定行的数据,但是因为这里选择更新的是特定行的数据,数据库中当前行被更新了,标识是V2,但是页面标识并不会更新,因为更新的是特定行,不是当前行,页面不知道当前行也更新了。所以数据库中标识是V2, 页面上当前行标识依旧是V1, 就这导致点击排序按钮,再次执行更新数据库时,对比标识,就会报错。
逻辑原理就是上面的原因,所以加一设置当前行命令就好了,原因就是设置当前行之后,当前行会重新获取,页面上的标识也会变成最新的标识V2,这样后面再进行排序就没问题了。
或者也可以考虑在页面加载时命令中使用设置当前行命令+更新当前行去实现
|