php里如果二个人同时操一个数据库里表的字段,怎么避免
比例,php里,现在有两个管理员同时修改一个字段,a管理员把字段里值改1,b管理员把字段里值改2,那这个字段的值到低改成什么了,同时到达服务器数据库,没有先后顺序的,这种...
比例,php里,现在有两个管理员同时修改一个字段,a管理员把字段里值改1, b管理员把字段里值改2,那这个字段的值到低改成什么了,同时到达服务器数据库,没有先后顺序的,这种要怎么避免,可不可以用一个排名的操作,
展开
7个回答
展开全部
首先,这个问题只有在特殊情况下才算是问题,大多数情况下可以不作考虑。
然后,这是问题很难描述清楚,解决方案有多种,下面提供一种较方便易用的方式
场景(问题)描述如下:
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字段赋值,以此替代触发器的作用。
然后,这是问题很难描述清楚,解决方案有多种,下面提供一种较方便易用的方式
场景(问题)描述如下:
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字段赋值,以此替代触发器的作用。
追问
我说是同时操作啊,我就是特殊情况,你说是先是A操作了,然后B去操作,现在安2008-10-17 13:46:00,AB都这个时间更新,修改同个字段,A改名字为张三1,B改名字为张三2,那到底改成什么了
追答
同时在时分秒 毫秒提交的机率啊。。。
展开全部
不用考虑这个
因为数据一般情况下不会出现你说的没有先后顺序的情况。
php你可以使用文件锁来避免你说的情况。
flock
随便建个文件
一个人操作时,如果文件能打开,就加上锁,然后进行下面的操作,结束后解除锁。不能打开就等待或返回失败
因为数据一般情况下不会出现你说的没有先后顺序的情况。
php你可以使用文件锁来避免你说的情况。
flock
随便建个文件
一个人操作时,如果文件能打开,就加上锁,然后进行下面的操作,结束后解除锁。不能打开就等待或返回失败
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你这问题本身是有矛盾的。写入操作必然有一个顺序,不可能出现同时写的情况,因为写的时候会加锁,在这个写锁的生存周期里,其它连接可以读但不可以写。字段最后的值是哪一个只能是由最后写入的值决定。猜测楼主你的意思应该是指并发问题,比如类似于抢购限定数量的商品(或其它什么券),如何不出现实际发放的数量不多于限定数量的问题。如果是这种情况,你可以看一下这里http://blog.csdn.net/liangpei2008/article/details/7920397
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
在服务器端设上一个lock,不懂看看<操作系统>
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
不会出现同时达到,这种情况不会发生。除非天塌了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询