如何避免两台电脑提交相同数据
admin 发表于 2010-08-18 | 来源:互联网 | 阅读:

在页面有个按钮对表单数据进行Insert操作,在Insert之前会验证提交的数据是否已经存在于数据库,如果多台电脑不在同一时刻提交的话,通过这个验证可以避免插入相同的数据;如果多台电脑在同一时刻提交,那个验证就变得没有意义了,会把相同的数据插入到数据库中,请问各位有什么办法避免这样的问题。
谢谢!

已经有25 个评论
  1. 徐咏波 说:

    事务吧

  2. wtaxum 说:

    能给个详细的说明么。。

  3. wtaxum 说:

    数据库的表没有设置主键?相同的数据不会主键冲突吗?

  4. boysee 说:

    理论上存在同时提交的现象,但实际中基本不可能发生

  5. 萌芽邪恶 说:

    数据库的表没有设置主键?相同的数据不会主键冲突吗?不是为了验证主键重复,只是某个字段的值重复。。

  6. jc2008_828 说:

    理论上存在同时提交的现象,但实际中基本不可能发生是啊,这个也考虑过的,可是做测试的同事就干了这事儿,我也得想办法搞定这个东东。。

  7. lchz 说:

    加锁lock(this){}

  8. lee 说:

    最简单的方法一:前台按钮:<asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" OnClientClick="this.form.submit();this.disabled=true" UseSubmitBehavior="False" />  后台代码:protected void Page_Load( object sender, EventArgs e )  {  if (Page.IsPostBack)  {  Button1.Attributes.Add("disabled", "disabled");  }  }  最简单的方法二:this.btnSubmit.Attributes["onclick"] = this.GetPostBackEventReference(this.btnSubmit) + ";this.disabled=true;"; //防止重复提交

  9. lchz 说:

    数据库的表没有设置主键?相同的数据不会主键冲突吗?不是为了验证主键重复,只是某个字段的值重复。。就如同提问一样的,标题最好不要一样。这样子可以写个验证的,在insert之前判断是否有相同的标题,没有再插入可以利用存储过程来加以实现。

  10. 546914408 说:

    这种事情当然有可能发生,使用事务是不能阻止脏数据的出现的,因为事务仅仅作用于当前用户域内,保证当前用户的操作是一个原子操作,但是当多个用户同时操作时,脏数据的出现不可避免。sql默认的几种事务隔离级别只有很有限的约束力。一般的方法是使用时间戳,时间戳可以用时间或者guid,每次请求数据库的数据都保存当前会话的时间戳,每次向数据库提交或更改数据,首先验证时间戳是不是当前会话的时间戳。是的话,继续正常操作。不是的话表示在当前用户的两次请求间,已经发生了数据的其他操作。当前操作丢弃,重新加载数据。如果在大的耗时事务时,应该使用数据库锁,防止其他用户的提交。

  11. 萌芽邪恶 说:

    http://blog.csdn.net/rwm5366745/archive/2010/08/17/5817631.aspx

  12. 天天累 说:

    这种事情当然有可能发生,使用事务是不能阻止脏数据的出现的,因为事务仅仅作用于当前用户域内,保证当前用户的操作是一个原子操作,但是当多个用户同时操作时,脏数据的出现不可避免。sql默认的几种事务隔离级别只有很有限的约束力。一般的方法是使用时间戳,时间戳可以用时间或者guid,每次请求数据库的数据都保存当前会话的时间戳,每次向数据库提交或更改数据,首先验证时间戳是不是当前会话的时间戳。是的……有道理。

  13. xydrj 说:

    写个存储过程里面加个事物比如:create procedure p_?@变量 类型asdeclare @errorcode intset @errorcode=0开始事物begin transaction  执行语句,并判断@errorcode为不为空,如果为空就 rollback 否则 commit

  14. nrc001 说:

    楼上说的很多了,数据库中给某字段建立唯一约束也行。

  15. 421056 说:

    给那个字段建唯一性索引吧,外面加个try{}catch这样应该也行吧

  16. xwcylm 说:

    插入前判定数据库中有没有这样一条记录就可以了

  17. cxjasx 说:

    如果用到多线程,判断代码要加锁

  18. 546914408 说:

    按钮提交的时候,进行了几个操作:1、把提交的数据作为参数传递到方法1中去验证是否数据库已经有重复的。2、如果验证成功,有另外的业务去处理。验证不成功,执行中止,提示消息。3、在另外一个业务处理完成之后再来进行的Insert操作。这不是建立一个唯一约束就行的,建立唯一约束,对insert的操作是有用的,但是对于验证来说却没什么意义。比如说两台电脑,同时提交的时间差非常小,当第一台电脑在验证成功后正在做中间的业务处理,还未进行insert操作,第二台电脑也开始做验证,这时去数据库里验证肯定是通过的。问题是怎样在第一台电脑未insert之前,第二台电脑去数据库验证时也不能验证通过。

  19. dddylwlw 说:
  20. 好色的皮卡丘 说:

    关注,学习!虽然这种可能性很小

  21. 15375 说:

    mark up

  22. lchz 说:

    这种事情当然有可能发生,使用事务是不能阻止脏数据的出现的,因为事务仅仅作用于当前用户域内,保证当前用户的操作是一个原子操作,但是当多个用户同时操作时,脏数据的出现不可避免。sql默认的几种事务隔离级别只有很有限的约束力。一般的方法是使用时间戳,时间戳可以用时间或者guid,每次请求数据库的数据都保存当前会话的时间戳,每次向数据库提交或更改数据……我觉得还有就是加锁,这是处理多线程的最好的方式。

  23. 天天累 说:

    个人意见:加锁

  24. jc2008_828 说:

    加锁lock(this){}UP+1

  25. 15375 说:

    请用事务 + 枷锁 可以避免

我要评论

评论功能因故关闭!

请加入我们的QQ群一起参与讨论:群号59400482(500人超级群)


返回首页 | 关于我们 | 联系我们 | 广告合作 | 网站地图 | 友情链接 | 版权声明