关于数据并发

当多个用户同时更新同一数据的时候,由于更新可能导致数据的不一致性,使得程序的业务数据发生错误,这种情况可以称之为并发。在ADO .NET中,并发的处理可以通过三种方式来控制:保守式并发控制、开发式并发控制以及最后更新生效方式。 

  • 保守式并发控制:数据从数据库取出之后,一直处于锁定的状态,其他用户不能获取该数据,直至数据更新完毕之后,用户才能取出该数据进行操作。此种控制方式对于性能和资源占用得很多,由于只能同时有一个用户对数据享用操作权,所以可能会在正常业务中,影响其他用户的处理进程。但此控制方式可以完全保证数据的完整性。该方式可以通过.NET提供的事务机制来实现,前提是数据源需要支持事务。
  • 开发式并发控制:数据在更新之前都是可以被其他用户使用的,只有在更新的时候,才锁定记录。但更新的时候,会比对与查询之初的数据是否吻合,如果不一致,则不运行修改。此种控制方式也可以完全保证数据的完整性,其优点是不会占用其他用户访问该数据的权限,其缺点是由于其他用户可能已经更新了这些数据,导致本次更新可能不会完成。对于此种控制方式,多以开发人员通过程序本身的业务逻辑来实现。
  • 最后更新生效方式:此种方式同上,只有在数据更新的时候,其他用户才不可使用,但更新的时候不检查是否与开始数据一致,而直接对其更新。此种方式对于更新的并发性有很大的支持,但缺点是可能引发前后数据的不一致。此种方式适合可以满足此需求的业务场景使用。

注意:数据库的并发处理并不是一成不变的,不同的业务场景对数据库的并发要求是不一样的,可以根据具体情况具体分析

我的问题是,在购物的场景中,购买了一个商品,库存自然会减少。当有多个用户同时对此商品进行操作的时候,怎么解决数据的完整性,比如说库存为1,可是有10个人去购买,当然是第一个可以购买,其他的都会因为库存不足而导致操作失败。怎么做?

有的人说用队列……

我用事务,浅浅地只知道事务可以保持数据完整性。可能事务属于“保守式并发控制”,更新的时候不检查是否和数据库数据一致,直接更新。

测试了一下。发现事务在update、delete、insert的时候,会锁定该表,直至commit才释放。锁定期间不能对该表执行任何操作,访问也不行。

在select的时候则不会锁定。

——真的不知道啊,只能先用事务了,可能高并发的时候会出现一些错误吧。

天啊,一想到这种问题,自己就想滚出编程圈,做个机智的少年。

原文地址:https://www.cnblogs.com/hougelou/p/3770826.html