前面的人在编辑中,后面的人在打开这个页面也编辑该人员的信息,提交后会把后面的人就把前面的提交的给覆盖掉了,这种情况该怎么处理?是不是要加锁啊,表示没处理过类似,该怎么处理啊

解决方案 »

  1.   

    这个好像跟并发没关系吧.LZ从来没说"同时"吧.我理解的LZ可能是这样的.A跟B用户 分别打开了xxxedit.aspx?id=34这个页面A在textbox1里面输入了AAAA 点击保存.B在textbox1里面输入了BBBB 也点击保存 但是 A先点B后点 这个时候 B的数据覆盖了A的数据..是这个意思吧LZ?其实这是很普通的操作我个人觉得没必要做"限制"  你可以双开QQ空间 然后改名字   同样的也是覆盖的道理...这很正常 所以我觉得你应该从流程上处理问题 而不是从代码里...
      

  2.   

    赞同3楼说的,加个时间戳或是GUID。
    也就是,在新增时,生成一个时间戳或是GUID保存到一个字段中;当修改时,也读出这个值,再保存时,先读数据库中的这条记录,看看里面的值和之前读出来的值是否一样,如果不一样,提示已经被人修改了,不能保存;如果一样,就可以保存。
      

  3.   

    一般来说,允许这种冲突,不去纠结它。如果你要处理,你要从业务上去进行设计,例如设置一个字段去说明“谁谁谁占用了某个数据”,这样另一个业务意义上的“编辑”界面在进入操作时就会异常处理;或者你设置一个字段表示谁谁谁最后修改了数据“,这样另一个业务意义上的“编辑”界面在最后真正保存数据的那一刻要求判断一下数据库里这个字段值跟自己页面内存状态中保存的原始值是否一致,不一致就只好放弃当前的用户辛苦进行的编辑......但是一般来说,其实不去纠结它。例如你给一个人100块钱,我给同一个人50块钱,那么只要保证最终这个人得到了150块钱就行了,而并不纠结什么“加锁”。例如a给一个人设置了一个头像,而b给同一个人也设置了头像,结果就是b设置的头像,那么a也得“认”这个结果。一般来说,都是通过调整业务粒度的“粗、细”来解决问题,最终一致就可以停止程序重构了。通常不保证每一个操作完美得符合洁癖的要求。
      

  4.   

    你们的请假单,在已经批准了之后,能被修改,那很简单地哪怕写个数据库触发器约束,或者程序至少做一个判断就行了。这是逻辑bug,其实你说的跟所谓的“4小时操作也必须加锁”无关!不过我想说的是,了解大的原则和目的(就是为了网络上操作流畅,大家都不要受阻),剩下的慢慢再去重构。
      

  5.   


    这个很简单!只要发一个公司规定:一旦查出来有这种操作的人,扣1000块钱,或者开除,就行了。至于能不能从随时系统上查出来这种行为,公司经理会不会要求某个技术人员在某一天去编写一个小程序来打印这种报表,你认为能还是不能发生这种事儿呢?而并没有必要去以为所有的公司经理都是傻子啊。这只是一个小的例子,实际上可能会更夸张。出库单,主从表的。从表先建几条正常的记录,再点新增按钮,出现新增界面。然后让领导签核,领导签完后,在新增界面再建一个特殊的记录,(例如在电脑公司,建一条20个6800K的CPU的出库记录),可以保存。然后就从库管那边拿出这些东西,人就潜逃了。罚款、开除就已经没意义了。
    而且,在保存时,只判断有没有批准,还是有问题,一条记录,别人打开了,输入进去一大堆的文字,你也打开了,他刚一保存,你也随手一保存。结果就是,他白输入了那么多的字了,被你的操作给覆盖了。
      

  6.   

    像我们公司用的ERP是鼎新的TIPTOP,新版的不了解,我们用的版本,如果这条记录有人点了修改,其他人就只能看,不能修改、删除。
    只有点了保存,其他人才能点修改或删除。
    如果在修改的状态中,电脑死机或是重启,那就等吧,半小时后才会自动解锁。(也可由管理员人工去解锁。)
      

  7.   

    如果是sql已经帮你加锁了,没事。又不是同时写同一个文件才考虑文件并发问题,要加锁,使用队列模式
      

  8.   

    至于你说的后一种模式,其实也不是技术问题。依然是逻辑策略问题。不说别的,你的代码版本控制工具,就有vss和svn两种典型策略。vss是独占模式(一人修改,其他人都只是副本,他不提交,没人能提交),svn共享模式(大家都能修改,不过冲突提示,自己解决)
      

  9.   

    这就是SVN嘛 
      

  10.   

    .net dataset更新数据库的时候,本身就相当好。可能很我人不知道或者不会用。
    System.Data.SqlClient .SqlCommandBuilder  更新到数据库的时候,只要有一个值被改变,则更新失败。微软在开发.net时就已经替你考虑好了。
      

  11.   


    之前在用Delphi时,用数据绑定控件,Delphi就会帮着处理,当有一列改变了,保存不了。
    但另一个方法,就是主从表,从表点新建,然后找经理签核,主档审核了,从表在新建界面,还是可以保存的。因为在从表保存时,没有再次验证主表有没有审核。去年看一家公司给的源代码,用的是asp.net的多层架构(bll、model、dal的那个),在保存时,就是用主键一个条件去更新,也是没有判断其他字段有没有变、有没有审核。
      

  12.   


    这个很简单!只要发一个公司规定:一旦查出来有这种操作的人,扣1000块钱,或者开除,就行了。至于能不能从随时系统上查出来这种行为,公司经理会不会要求某个技术人员在某一天去编写一个小程序来打印这种报表,你认为能还是不能发生这种事儿呢?而并没有必要去以为所有的公司经理都是傻子啊。这个规定不合理的,如果系统允许修改,就是合理的,因为请假的人不一定就是在钻这个空子
    正确的做法应该是,申请一旦提交,就流动到下一个管理人的环节,申请人不能再修改,只能由审批人审批通过或者退回;只有审批人退回之后才能由编辑人重新编辑;如果你的请假时间没有确定,可以存为“草稿”。
    这也是大多数的OA类软件普遍使用的做法。
    我说的这种问题,在WinForm上更容易出现,而网站这种,则不太容易出现,像CSDN这样的网站,基本上不会出现,因为大多数人只有新增权限,没有修改及删除权限。
    OA系统也要看代码具体的写法了。不知你们公司有没有在用OA,是否可以一个账号在多台电脑上登录。如果有OA,且一个账号可以在多台电脑上登录,可以试试:新建一张请假单,保存到草稿,然后进入草稿箱,看到这个草稿。再在另一台电脑上用你的账号登录,也进入草稿箱,应该也能看到这个草稿。两台电脑上都点编辑,应该都能进入修改界面。然后,一台电脑点提交,应该能正常提交出去,另一台电脑,修改一下内容,再点保存到草稿(或是提交,都可以试试),如果代码写的不够强,就会发现,已经提交的单子,被修改了。如果结构、代码写的简单,你可以在草稿箱里点删除,在提示是否要删除时,另一台电脑提交,这台电脑上再点是,单子可能就被删除了。因为一般情况下,都是在点删除时,先判断各种可能,都没问题了,再提示要删除,当点“是”了,就不会再判断什么了,就是一条删除语句。
      

  13.   


    这个很简单!只要发一个公司规定:一旦查出来有这种操作的人,扣1000块钱,或者开除,就行了。至于能不能从随时系统上查出来这种行为,公司经理会不会要求某个技术人员在某一天去编写一个小程序来打印这种报表,你认为能还是不能发生这种事儿呢?而并没有必要去以为所有的公司经理都是傻子啊。这个规定不合理的,如果系统允许修改,就是合理的,因为请假的人不一定就是在钻这个空子
    正确的做法应该是,申请一旦提交,就流动到下一个管理人的环节,申请人不能再修改,只能由审批人审批通过或者退回;只有审批人退回之后才能由编辑人重新编辑;如果你的请假时间没有确定,可以存为“草稿”。
    这也是大多数的OA类软件普遍使用的做法。
    我说的这种问题,在WinForm上更容易出现,而网站这种,则不太容易出现,像CSDN这样的网站,基本上不会出现,因为大多数人只有新增权限,没有修改及删除权限。
    OA系统也要看代码具体的写法了。不知你们公司有没有在用OA,是否可以一个账号在多台电脑上登录。如果有OA,且一个账号可以在多台电脑上登录,可以试试:新建一张请假单,保存到草稿,然后进入草稿箱,看到这个草稿。再在另一台电脑上用你的账号登录,也进入草稿箱,应该也能看到这个草稿。两台电脑上都点编辑,应该都能进入修改界面。然后,一台电脑点提交,应该能正常提交出去,另一台电脑,修改一下内容,再点保存到草稿(或是提交,都可以试试),如果代码写的不够强,就会发现,已经提交的单子,被修改了。如果结构、代码写的简单,你可以在草稿箱里点删除,在提示是否要删除时,另一台电脑提交,这台电脑上再点是,单子可能就被删除了。因为一般情况下,都是在点删除时,先判断各种可能,都没问题了,再提示要删除,当点“是”了,就不会再判断什么了,就是一条删除语句。这个是更新或删除时,没判断单据的状态吧。
    Where条件中要加单据状态的限制
    或者在更新前,要加状态的检查
      

  14.   


    这个很简单!只要发一个公司规定:一旦查出来有这种操作的人,扣1000块钱,或者开除,就行了。至于能不能从随时系统上查出来这种行为,公司经理会不会要求某个技术人员在某一天去编写一个小程序来打印这种报表,你认为能还是不能发生这种事儿呢?而并没有必要去以为所有的公司经理都是傻子啊。这个规定不合理的,如果系统允许修改,就是合理的,因为请假的人不一定就是在钻这个空子
    正确的做法应该是,申请一旦提交,就流动到下一个管理人的环节,申请人不能再修改,只能由审批人审批通过或者退回;只有审批人退回之后才能由编辑人重新编辑;如果你的请假时间没有确定,可以存为“草稿”。
    这也是大多数的OA类软件普遍使用的做法。
    我说的这种问题,在WinForm上更容易出现,而网站这种,则不太容易出现,像CSDN这样的网站,基本上不会出现,因为大多数人只有新增权限,没有修改及删除权限。
    OA系统也要看代码具体的写法了。不知你们公司有没有在用OA,是否可以一个账号在多台电脑上登录。如果有OA,且一个账号可以在多台电脑上登录,可以试试:新建一张请假单,保存到草稿,然后进入草稿箱,看到这个草稿。再在另一台电脑上用你的账号登录,也进入草稿箱,应该也能看到这个草稿。两台电脑上都点编辑,应该都能进入修改界面。然后,一台电脑点提交,应该能正常提交出去,另一台电脑,修改一下内容,再点保存到草稿(或是提交,都可以试试),如果代码写的不够强,就会发现,已经提交的单子,被修改了。如果结构、代码写的简单,你可以在草稿箱里点删除,在提示是否要删除时,另一台电脑提交,这台电脑上再点是,单子可能就被删除了。因为一般情况下,都是在点删除时,先判断各种可能,都没问题了,再提示要删除,当点“是”了,就不会再判断什么了,就是一条删除语句。这个是更新或删除时,没判断单据的状态吧。
    Where条件中要加单据状态的限制
    或者在更新前,要加状态的检查这就是要看逻辑、经验及各方面的管理,才能保证程序的健壮。已经发现的问题,基本上都不是问题了,就怕的是那些没发现的问题。
      

  15.   


    这个很简单!只要发一个公司规定:一旦查出来有这种操作的人,扣1000块钱,或者开除,就行了。至于能不能从随时系统上查出来这种行为,公司经理会不会要求某个技术人员在某一天去编写一个小程序来打印这种报表,你认为能还是不能发生这种事儿呢?而并没有必要去以为所有的公司经理都是傻子啊。这个规定不合理的,如果系统允许修改,就是合理的,因为请假的人不一定就是在钻这个空子
    正确的做法应该是,申请一旦提交,就流动到下一个管理人的环节,申请人不能再修改,只能由审批人审批通过或者退回;只有审批人退回之后才能由编辑人重新编辑;如果你的请假时间没有确定,可以存为“草稿”。
    这也是大多数的OA类软件普遍使用的做法。
    我说的这种问题,在WinForm上更容易出现,而网站这种,则不太容易出现,像CSDN这样的网站,基本上不会出现,因为大多数人只有新增权限,没有修改及删除权限。
    OA系统也要看代码具体的写法了。不知你们公司有没有在用OA,是否可以一个账号在多台电脑上登录。如果有OA,且一个账号可以在多台电脑上登录,可以试试:新建一张请假单,保存到草稿,然后进入草稿箱,看到这个草稿。再在另一台电脑上用你的账号登录,也进入草稿箱,应该也能看到这个草稿。两台电脑上都点编辑,应该都能进入修改界面。然后,一台电脑点提交,应该能正常提交出去,另一台电脑,修改一下内容,再点保存到草稿(或是提交,都可以试试),如果代码写的不够强,就会发现,已经提交的单子,被修改了。如果结构、代码写的简单,你可以在草稿箱里点删除,在提示是否要删除时,另一台电脑提交,这台电脑上再点是,单子可能就被删除了。因为一般情况下,都是在点删除时,先判断各种可能,都没问题了,再提示要删除,当点“是”了,就不会再判断什么了,就是一条删除语句。你说的这个漏洞其实可以避免的,就看做OA的人是否用心