多用户同时处理同一条数据解决办法

在c/s或多层中,如果两个用户同时打开一条记录,修改后提交会产生更新冲突;
据说办法有二:1。打开同时锁定表的记录 2。浦获错误,撤消其中一个用户的修改,但是很少见到具体实现的代码;请大家告诉具体的代码怎么写:
1。打开时如何锁定一条记录?
2。如何扑获更新错误?在delphi中调试时会报“该记录读出后已经被再次修改”,而在运行时如何判定错误为更新冲突?因为更新时其他的错误如输入不合法等也可能报错,如何把更新冲突和其他的分开?

=====================================================================

http://hi.baidu.com/nboy/blog/item/8d61c93d8ab3dec19f3d6288.html

首先,这个问题只有在特殊情况下才算是问题,大多数情况下可以不作考虑。

然后,这是问题很难描述清楚,解决方案有多种,下面提供一种较方便易用的方式

场景(问题)描述如下:

0,用户A、B同时打开一个页面,页面显示,客户表T_CUSTOMER字段(C_NAME、C_AGE)

姓名:张三,年龄:25

1,A 将姓名“张三”改为“张三1”,然后保存

2,B 将年龄“25”改为“30”,然后保存

这样A的操作就被覆盖了,姓名又变回“张三”了,大家一般怎么处处这种情况?

这里给出一个较易用的解决方案

给表添加一字段:LAST_UPDATE,即最后更新时间

回放场景

0,用户A、B同时打开一页面,面页显示:

姓名:张三,年龄:25,LAST_UPDATE:2008-10-17 13:45:00

1,A 将姓名“张三”改为“张三1”,然后保存

重点在这里:更新数据时WHERE条件里多一条件:AND LAST_UPDATE = ‘2008-10-17 13:45:00‘

更新成功,此时触发器会将当前时间“2008-10-17 13:46:00”赋值给LAST_UPDATE

2,B 将将年龄“25”改为“30”,然后保存

B更新数据时WHERE条件里也有这个条件:AND LAST_UPDATE = ‘2008-10-17 13:45:00‘,但此时LAST_UPDATE的值已经在A修改记录时变成2008-10-17 13:46:00

下面要做的就是给出提示了:喔哟,此信息在你发呆这段时间已被人改过啦,所以你需要返工。

触发器代码如下:
===================================================
CREATE OR REPLACE TRIGGER T_CUSTOMER
BEFORE UPDATE ON T_CUSTOMER
FOR EACH ROW
/*
记录最后修改时间
*/
BEGIN
:NEW.LAST_UPDATE := SYSDATE;
END;
===================================================

如果触发器不熟悉或者只是不喜欢用触发器,完全可以修改记录时同时给LAST_UPDATE字段赋值,以此替代触发器的作用。

----------------------------------------------------------------------------------------------------------------

http://blog.csdn.net/onemetre/archive/2010/11/06/5991658.aspx

时间: 2024-10-16 19:53:07

多用户同时处理同一条数据解决办法的相关文章

EF6 AddOrUpdate之后,数据没有改变而是新增了一条数据解决办法

EF:修改不是查询出来的对象dbContext.Web_User.AddOrUpdate(user);dbContext.SaveChanges(); 上面的写法有时候可能不起作用,而且把这条数据重复的添加了一遍.解决的办法是给它指定一下主键.//EF密码不能修改,是因为加了这个this.HasKey(t => new { t.ID, t.Name,t.Password});

Sql server 大数据量插入速度慢或丢失数据解决办法

问题描述:我的设备每秒2000条数据插入数据库,2个设备总共4000条,当在程序里面直接用insert语句插入时,两个设备同时插入大概总共能插入约2800条左右,数据丢失约1200条左右,找了好多解决方法,整理了两种效果比较明显的解决办法: 第一种:使用Sql Server函数: 1.将数据组合成字串,使用函数将数据插入内存表,后将内存表数据复制到要插入的表. 2.组合成的字符换格式:'111|222|333|456,7894,7458|0|1|2014-01-01 12:15:16;1111|

thinkphp 的save()不能更新数据解决办法

用save()方法始终更新不了数据,又不显示明确的错误信息,找了好久才在手册里看到一句至关重要的话: 为了保证数据库的安全,避免出错更新整个数据表,如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录. 因此在使用create自动更新数据时,要在表单添加一个隐藏域,其值为数据表的id值! thinkphp 的save()不能更新数据解决办法,布布扣,bubuko.com

ViewPage+frament不预加载下一个Frament数据解决办法

在做一个ViewPage+Frament 滑动数效果,当滑动到每一页时加载哪一页的数据,但是ViewPage会预加载下一也数据,这个问题之前做项目是一直未解决,今天找到一个方法一下子就解决的这个问题,Frament里面有一个setUserVisibleHint方法,setUserVisibleHint每次fragment显示与隐藏都会调用,下面说一下这个方法的使用 @Override public void setUserVisibleHint(boolean isVisibleToUser)

想要隐藏掉gridview中的某一列,但是还想要使用该列数据解决办法。

试过visable=“false”  只能隐藏掉数据,但是访问的时候变成“”了.即无法使用.后来改变使用了模版列可以达到想要的效果.可以隐藏,可以访问. aspx页面: <asp:TemplateField Visible="false">                    <ItemTemplate>                        <asp:label ID="lbdefault" runat="serv

mybatis 关联查询时,从表只返回第一条记录解决办法

如果两表联查,主表和明细表的主键都是id的话,明细表的多条只能查询出来第一条. 造成以上情况可能的原因: 1.级联查询的时候,主表和从表有一样的字段名的时候,在mysql上命令查询是没问题的.但在mybatis中主从表需要为相同字段名设置别名.设置了别名就OK了. 例子: 主表Standard, 从表StandEntity,均有名为id的字段 1 <resultMap id="StandardAndEntityResultMap" type="whu.edu.irlab

通过Excel导入Mysql 超过65535条数据的办法

1.截取 65534条数据,进行分sheet,然后1个sheet导入一张表,最后进行整合! 2.采用TXT导入方式,TXT的导入暂时没发现限制的数据条数,下午用TXT导入74万条数据成功 3.如果遇到log型的日志导入MySQL,可以直接复制成TXT,然后利用分隔符加上表头进行导入?

Junit测试Controller(MockMVC使用),传输@RequestBody数据解决办法

一.单元测试的目的 简单来说就是在我们增加或者改动一些代码以后对所有逻辑的一个检测,尤其是在我们后期修改后(不论是增加新功能,修改bug),都可以做到重新测试的工作.以减少我们在发布的时候出现更过甚至是出现之前解决了的问题再次重现. 这里主要是使用MockMvc对我们的系统的Controller进行单元测试. 对数据库的操作使用事务实现回滚,及对数据库的增删改方法结束后将会还远数据库. 二.MockMvc的使用 1.首先我们上一个例子, import org.apache.commons.log

阿里云监控获取不到数据解决办法

查看云服务器是否正常运行,如无问题,下面可分为二种情况,一种有外网和无外网. 注意:下列操作需要使用administrator或者root权限执行安装与卸载的操作: 有公网IP地址云监控组件安装 1. Linux类系统: 1) 确认操作系统中已有unzip.iostat命令.如果没有,请通过yum install unzip sysstat或apt-get install unzip sysstat进行安装. 2) wget http://update.aegis.aliyun.com/down