1-2.数据一致性问题

避免并发造成数据不一致的问题,即不希望因为并发操作导致数据不一致或结果不准确。

基本思路就是不让线程同时操作,将并发操作顺序化,方法有:

1.加锁(分布式锁)
当多个线程同时操作时,由于有锁的原因,只有第一个获得锁的线程才能操作,其他线程将按获得锁的顺序进行操作;

2.使用缓存或队列(并发请求串行化)
将所有的线程请求放到队列中,然后从队列中取线程操作。
跟线程阻塞的处理方法一致。
这种方法要求将所有的操作封装到线程中,不是轻量级,不是一种局部处理的方法。

3.乐观锁(秒杀,领券)
先从数据库取数据,比如库存count;
然后update count-1,获得返回结果:
如果结果为1,说明成功;
如果结果为0,再取一次count:
如果count=0说明确实库存为0;
如果count>0,说明刚才由于并发问题导致减库存失败,实际库存并不为0,这种情况下需要循环操作直到update成功或库存为0。

乐观锁扩展:
所有对数量的更新操作,包括增加和减少,都要使用乐观锁:先查数据库再更新;
如果是减少,参考上面;
如果是增加,如果update结果为1,说明成功;
如果为0,循环(取数据,update直到结果为1)

乐观锁:
通过不断重试确定更新是否成功。
循环:
取数据
update
  |----=1成功,跳出循环
  |----=0失败
    |----如果是减少,取数据,=0说明库存为0,跳出循环
    |----如果是增加,取数据,判断是否达到上限,是跳出循环

注意:这种方法不是很可靠,有可能当前线程在update时,已有多个线程进行过更新,这时当前线程可以更新成功,但是覆盖了其他线程的更新。
例如:
A线程准备将count从5减为4,在此更新未完成前,B线程已将count从5减为4,此时A线程的更新将不会成功;
如果在此期间又有线程C将count从4减为3,则线程A可以更新成功,但是将count从3变成4,是一种错误的更新,覆盖了其他线程的结果;
上面两种情况本质上都是数据一致性的问题,
使用循环取值的方法可以解决第一种情况,但不能解决第二种情况;
更好的方法参考乐观锁目录下的方法;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库原理第三章:关系数据库标准语言SQL 数据系统概论chp3-2全文共66页,当前为第1页。 问题 1. 模式的作用是什么?它和用户有什么关联? 2. SQL Server2008在删除模式时的默认级联选项是什么? 3.在创建数据表时添加约束有几种方法? 数据系统概论chp3-2全文共66页,当前为第2页。 3.3.3 索引的建立与删除 在应用系统中,尤其在联机事务处理系统中,对数据查询及处理速度已成为衡量应用系统成败的标准。而采用索引来加快数据处理速度通常是最普遍采用的优化方法。 数据库中的索引与书籍中的目录类似。 在一本书中,利用索引可以快速查找所需信息,无须阅读整本书。书中的目录是一个词语列表,其中注明了包含各个词的页码。 数据库中的索引是,其中注明了表中包含各个值的行所一个表中所包含的值的列表在的存储位置。 数据系统概论chp3-2全文共66页,当前为第3页。 SQL Server中数据的访问方法: 表扫描法:当访问未建索引的表内数据时,从表的起始处逐行查找,直到符合查询条件为止。 使用索引:当使用索引访问建有索引的表内数据时,系统会通过遍历索引树结构来查找行的存储位置,效率非常高。 数据系统概论chp3-2全文共66页,当前为第4页。 索引的作用 通过创建唯一索引,可以增强数据记录的唯一性。 可以大大加快数据检索速度。 可以加速表与表之间的连接,这一点在实现数据的参照完整性方面有特别的意义。 可以显著减少查询中分组和排序的时间。 使用索引可以在检索数据的过程中使用优化隐藏器,提高系统性能。 数据系统概论chp3-2全文共66页,当前为第5页。 关系数据库管理系统中常见索引: 顺序文件上的索引 B+树索引 散列(hash)索引 位图索引 特点: B+树索引具有动态平衡的优点 HASH索引具有查找速度快的特点 数据系统概论chp3-2全文共66页,当前为第6页。 索 引 谁可以建立索引 数据库管理员 或 表的属主(即建立表的人) 谁维护索引 关系数据库管理系统自动完成 使用索引 关系数据库管理系统自动选择合适的索引作为存取路径,用户不必也不能显式地选择索引 数据系统概论chp3-2全文共66页,当前为第7页。 索引的分类 如果以存储结构来区分,则有"聚集索引"(Clustered Index,也称聚类索引、簇集索引)和"非聚集索引"(Nonclustered Index,也称非聚类索引、非簇集索引)的区别; 如果以数据的唯一性来区别,则有"唯一索引"(Unique Index)和"非唯一索引"(Nonunique Index)的不同; 若以键列的个数来区分,则有"单列索引"与"多列索引"的分别。 数据系统概论chp3-2全文共66页,当前为第8页。 1.聚集索引聚集索引将数据行的键值在表内排序并存储对应的数据记录,使得数据表物理顺序与索引顺序一致。当以某字段作为关键字建立聚集索引时,表中数据以该字段作为排序根据。因此,一个表只能建立一个聚集索引,但该索引可以包含多个列(组合索引) 数据系统概论chp3-2全文共66页,当前为第9页。 2.非聚集索引非聚集索引完全独立于数据行的结构。数据存储在一个地方,索引存储在另一个地方。非聚集索引中的数据排列顺序并不是表格中数据的排列顺序。 SQL Server默认情况下建立的索引是非聚集索引。一个表可以拥有多个非聚集索引,每个非聚集索引提供访问数据不同排序顺序。 数据系统概论chp3-2全文共66页,当前为第10页。 3.唯一索引唯一索引是指索引值必须是唯一的。聚集索引和非聚集索引均可用于强制表内的唯一性,方法是在现有表上创建索引时指定UNIQUE关键字。确保表内唯一性的另一种方法是使用UNIQUE约束。 数据系统概论chp3-2全文共66页,当前为第11页。 创建索引的方法 1.系统自动创建索引系统在创建表中的其他对象时可以附带地创建新索引。通常情况下,在创建UNIQUE约束或PRIMARY KEY约束时,SQL Server会自动为这些约束列创建聚集索引。 2.用户创建索引除了系统自动生成的索引外,也可以根据实际需要,使用对象资源管理器或利用SQL语句中的CREATE INDEX命令直接创建索引。 数据系统概论chp3-2全文共66页,当前为第12页。 1. 建立索引 语句格式 CREATE [UNIQUE] [CLUSTER] INDEX <索引名> ON <表名>(<列名>[<次序>][,<列名>[<次序>] ]…); <表名>:要建索引的基本表的名字 索引:可以建立在该表的一列或多列上,各列名之间用逗号分隔 <次序>:指定索引值的排列次序,升序:ASC,降序:DESC。缺省值:ASC UNIQUE:此索引的每一个索引值只对应唯一的数据记录 CL

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值