如何解决避免同时打开一条记录的问题? 用innodb格式,然后可以用事务处理 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 function order_LOCK() { //加锁相关表 global $tabname; $sql = "LOCK TABLES {$tabname['order']} WRITE, {$tabname['user']} WRITE , {$tabname['card']} WRITE , {$tabname['cardlog']} WRITE, {$tabname['goods']} READ"; @mysql_query("$sql");}function order_UNLOCK() { //全部解锁 $sql = "UNLOCK TABLES"; @mysql_query("$sql");} mysql支持行级锁吗,如果按scsjs(闪电回归) 的方法是不是整个order表都锁定了,那其他人不是都不能操作了,请问gu1dai(异域苍穹......追夢人) ,为什么需要新建一个状态表,我并不是很明白,如何用程序控制!请问 syre(神仙) ,如果用事务处理该怎么写?谢谢各位! mysql 5 是不是支持行锁定啦? 在表里增加一个字段 修改时间 updatetime在session中记录打开编辑页面的时间 opentime具体流程如下:时间 A用户 B用户 A的session B的session 数据库7:00 开始编辑 opentime=7:00 7:01 开始编辑 opentime=7:01 7:02 保存结果 updatetime=7:027:03 试图保存结果,检查发现updatetime>b的opentime, 提示记录已被修改,是否强行保存或者取回新的记录 咳咳,上面的表格乱了,时间 A用户 ----B用户 ----A的session ----B的session -----数据库7:00 开始编辑 ---------opentime=7:007:01 ------开始编辑 -------------opentime=7:017:02 保存结果 ---------------------------updatetime=7:027:03 ------试图保存结果,检查发现updatetime>b的opentime,---------提示记录已被修改,是否强行保存或者取回新的记录编辑时锁定是不行的,万一那人打开页面,上床睡觉了,别人怎么混上面的方法也可以更仔细一点,比如检查一下那些内容被修改了,一起提示给B用户 锁表,锁记录都是在确认对表修改之后实施的,楼主的问题是用户进入修改页面之后的状态就难以确定了,可能他打开页面一个小时后才修改,也可能就不修改了,所以锁的动作只能发生在提交save后,但这个时候往往需要执行的只有一个update或几个update/insert, 这个时候可以使用事务保证数据的一致。楼主关心的不是这个部分,而是两人或数人先后打开,后保存的人可能面对的是“脏数据”的问题。 re helloyou0(你好!) 编辑时锁定是不行的,万一那人打开页面,上床睡觉了,别人怎么混-------------------------------------------------------------当页面onload的时候,PHP程序已经执行完毕了,这时,所有数据锁自动解锁尽量减少锁定表操作中的代码。一般来说程序花不了几秒的时候。PHP程序执行完 MYSQL就自动解锁了,不会存在什么上床睡觉的问题。PS:使用mysql用事务回滚会很痛苦的说。 xuzuning(唠叨) 说的没有错。这个订单打开后,别的人就不可以操作了,如果他处理完订单,就不在出现在这个订单列表中,如果打开后,不操作,关闭后,其他人就可以操作订单,我要解决的就是,在某一个人打开这个订单后,别人就无法在打开他 好像都没看明白我说的,再解释一下:)数据库数据 为 比如 0,7:01 A用户打开编辑处理页面,他看到的值为0,7:02 B用户打开编辑处理页面,他看到的值也为07:03 A用户决定修改值为10, 然后保存,数据库值变为10,7:04 此时B用户看到的值还是0,因为他没有刷新,数据依旧为旧值 如果B用户此时修改值,并保存,他是在错误的基础上作的更改 这是应该避免的情况。在上面的情况中,如果A用户保存后不设置任何标志B用户保存时,将无法检测到数据库的更改,从而导致B用户的修改将覆盖A用户的更改。如果使用锁,只能在保存时加锁,但是在上面的流程里,加锁对该流程无任何影响。如果“在某一个人打开这个订单后,别人就无法在打开他”,如果A用户打开后非正常结束呢?或者长时间未保存呢?然后再回头看上面的处理方式,应该可行吧 1、定单是有唯一编号的,由定单生成时产生。不可能出现编号相同的定单,也就不可能两个及以上的人填写同一张定单2、由于某种原因用户中断了定单的填写将出现空白定单,在通常情况下该定单号将被废止不再使用3、如果希望启用被跳过的空白定单(楼主的意思就在这里)。需要经过以下过程a、列出可用的定单号共用户选择b、确认用户选中的定单号确实可用。由于可能数个用户同时选择同一定单号,这一步是不可少的c、对该定单号设置已用标志,这样当其他用户也选择该定单号时将不能通过确认而提示重选d、输出定单供用户填写e、用户确认已填定单后结束f、用户放弃定单的填写时,对该定单号设置未用标志这个过程是很费时的,要是我就不会选择定单填写而直接填写新定单。我也没有义务为你节省那点数据库空间 谢谢xuzuning(唠叨) ,不过你想错了,我要处理的是已经生成的订单,并不是订单生成的过程,helloyou0(你好!) 的方法和我现在的方法类似,不过我的方法有不足的地方,我是加了个字段表示是否此记录被打开,0是未打开,1是打开,每个人打开订单是会检查这个值,如果是1就不能打开了,但是在实际应用中还是会出现同时打开的现象,而且无法解决A用户打开后非正常结束的情况!如果用时间来作标示不知能解决这个问题吗? 再不你结合时间和标志位。当B试图打开时如果标志位为已打开,提示是否强行打开。(因为A用户如果非正常结束,会导致标志位锁死)“但是在实际应用中还是会出现同时打开的现象”这个应该能避免,检查你的update状态位的sql语句是否在合适的地方。---如果要再复杂一点,可以用ajax定期发信号到服务器保持状态位,一段时间无信号,就认为已经非正常退出,恢复标志位。时间的长短要掌握好。 xuzuning(唠叨)你误会了,下订单的是客人,而我这边要操作订单是公司内部员工,而且这个订单和普通商品的订单还不同,公司要审核订单内信息 学习,mysql怎样锁表锁记录啊 还是呀!这个过程还是跟我上面提到的操作空定单的过程基本一致的a、列出未处理的定单号供选择b、确认用户选中的定单号确实可用。由于可能数个用户同时选择同一定单号,这一步是不可少的c、对该定单号设置已审核标志,这样当其他用户也选择该定单号时将不能通过确认而提示重选d、输出定单供审核e、确认已审核定单后结束f、放弃定单的审核时,对该定单号设置未审核标志解决A用户打开后非正常结束的情况需要有特权用户进行或者由复审员进行 PHP获取网站根目录有几种方法? 通过delphi post数据到PHP+mysql服务器中存储,post后有什么方法能知道服务器已经处理成功; 请教一个简单的php问题~~~ 想租台服务器不知选哪家IDC好? 急!一个很简单的错误,帮忙找你下! 及时关闭服务器资源的代码(close),应该写在这段代码的那个位置呢? 怎么取出数据表中某行某列的值? php积分功能 PHP怎样读取ASP.NET的COOKIE或者SESSION 类问题 急求PHP+MYSQL的新闻程序 请问谁有一个繁体PHP版的在线编辑器?急啊!谢谢!
global $tabname;
$sql = "LOCK TABLES {$tabname['order']} WRITE, {$tabname['user']} WRITE , {$tabname['card']} WRITE , {$tabname['cardlog']} WRITE, {$tabname['goods']} READ";
@mysql_query("$sql");
}
function order_UNLOCK() { //全部解锁
$sql = "UNLOCK TABLES";
@mysql_query("$sql");
}
请问gu1dai(异域苍穹......追夢人) ,为什么需要新建一个状态表,我并不是很明白,如何用程序控制!
请问 syre(神仙) ,如果用事务处理该怎么写?
谢谢各位!
在session中记录打开编辑页面的时间 opentime具体流程如下:时间 A用户 B用户 A的session B的session 数据库
7:00 开始编辑 opentime=7:00
7:01 开始编辑 opentime=7:01
7:02 保存结果 updatetime=7:02
7:03 试图保存结果,检查发现updatetime>b的opentime,
提示记录已被修改,是否强行保存或者取回新的记录
咳咳,上面的表格乱了,时间 A用户 ----B用户 ----A的session ----B的session -----数据库
7:00 开始编辑 ---------opentime=7:00
7:01 ------开始编辑 -------------opentime=7:01
7:02 保存结果 ---------------------------updatetime=7:02
7:03 ------试图保存结果,检查发现updatetime>b的opentime,
---------提示记录已被修改,是否强行保存或者取回新的记录
编辑时锁定是不行的,万一那人打开页面,上床睡觉了,别人怎么混上面的方法也可以更仔细一点,比如检查一下那些内容被修改了,一起提示给B用户
楼主的问题是用户进入修改页面之后的状态就难以确定了,
可能他打开页面一个小时后才修改,也可能就不修改了,
所以锁的动作只能发生在提交save后,但这个时候往往需要
执行的只有一个update或几个update/insert, 这个时候
可以使用事务保证数据的一致。楼主关心的不是这个部分,
而是两人或数人先后打开,后保存的人可能面对的是“脏数据”的问题。
编辑时锁定是不行的,万一那人打开页面,上床睡觉了,别人怎么混
-------------------------------------------------------------
当页面onload的时候,PHP程序已经执行完毕了,这时,所有数据锁自动解锁
尽量减少锁定表操作中的代码。一般来说程序花不了几秒的时候。PHP程序执行完 MYSQL就自动解锁了,不会存在什么上床睡觉的问题。PS:使用mysql用事务回滚会很痛苦的说。
7:01 A用户打开编辑处理页面,他看到的值为0,
7:02 B用户打开编辑处理页面,他看到的值也为0
7:03 A用户决定修改值为10, 然后保存,数据库值变为10,
7:04 此时B用户看到的值还是0,因为他没有刷新,数据依旧为旧值
如果B用户此时修改值,并保存,他是在错误的基础上作的更改
这是应该避免的情况。
在上面的情况中,如果A用户保存后不设置任何标志
B用户保存时,将无法检测到数据库的更改,从而导致B用户的修改将覆盖A用户的更改。如果使用锁,只能在保存时加锁,但是在上面的流程里,加锁对该流程无任何影响。如果“在某一个人打开这个订单后,别人就无法在打开他”,
如果A用户打开后非正常结束呢?或者长时间未保存呢?然后再回头看上面的处理方式,应该可行吧
2、由于某种原因用户中断了定单的填写将出现空白定单,在通常情况下该定单号将被废止不再使用
3、如果希望启用被跳过的空白定单(楼主的意思就在这里)。需要经过以下过程
a、列出可用的定单号共用户选择
b、确认用户选中的定单号确实可用。由于可能数个用户同时选择同一定单号,这一步是不可少的
c、对该定单号设置已用标志,这样当其他用户也选择该定单号时将不能通过确认而提示重选
d、输出定单供用户填写
e、用户确认已填定单后结束
f、用户放弃定单的填写时,对该定单号设置未用标志
这个过程是很费时的,要是我就不会选择定单填写而直接填写新定单。我也没有义务为你节省那点数据库空间
如果用时间来作标示不知能解决这个问题吗?
当B试图打开时如果标志位为已打开,提示是否强行打开。
(因为A用户如果非正常结束,会导致标志位锁死)“但是在实际应用中还是会出现同时打开的现象”
这个应该能避免,检查你的update状态位的sql语句是否在合适的地方。---
如果要再复杂一点,可以用ajax定期发信号到服务器保持状态位,一段时间无信号,就认为
已经非正常退出,恢复标志位。时间的长短要掌握好。
a、列出未处理的定单号供选择
b、确认用户选中的定单号确实可用。由于可能数个用户同时选择同一定单号,这一步是不可少的
c、对该定单号设置已审核标志,这样当其他用户也选择该定单号时将不能通过确认而提示重选
d、输出定单供审核
e、确认已审核定单后结束
f、放弃定单的审核时,对该定单号设置未审核标志解决A用户打开后非正常结束的情况
需要有特权用户进行
或者由复审员进行