加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

Inside SqlServer 读书随笔:并发和事务

发布时间:2020-12-12 14:52:44 所属栏目:MsSql教程 来源:网络整理
导读:有一天看完在技术内幕里的并发和事务一节,明白了很多以前没有明白的基础理论,当时想总结和复述一下,以便加深理解。 后来没有写完,一直在桌面上。今天看到就把它暂时搬上来。 并发和事务 ? ? ? 并发可以理解为多个进程同时访问和修改同一数据(或共享数据)

有一天看完在技术内幕里的并发和事务一节,明白了很多以前没有明白的基础理论,当时想总结和复述一下,以便加深理解。

后来没有写完,一直在桌面上。今天看到就把它暂时搬上来。

并发和事务

? ? ? 并发可以理解为多个进程同时访问和修改同一数据(或共享数据)的能力和行为。

? ? ? 数据库系统一般采用两种方式来管理并发:悲观并发控制和乐观并发控制。SqlServer2005之前的版本只支持悲观并发控制。

? ? ? 两者的区别在于是在并发冲突发生之前进行预防还是在并发冲突发生后进行处理。

悲观并发控制

? ? ? ?是假定系统中存在足够多的数据修改操作,它们会对每一个确定要执行的读取操作产生影响。系统的悲观想法会造成:无论读取或者修改数据,都占有此数据上的锁来阻止其它进程对此数据的修改或读取。也就说,读、写会相互阻塞。

乐观并发控制:

? ? ? 是假定系统存在非常少的会造成冲突的数据修改操作,以致于任何单独的事务几乎不会修改其它事务正在使用的数据。乐观并发控制采用行版本控制来保存发生修改前数据行的一个副本,如果这时候有读取操作发生则会读取副本数据,两者之间不会冲突。但是两个修改操作之间还会冲突,也就说,会有写--写阻塞。

?

任何事务都具有ACID属性。

A(原子性):任何事务要么提交,则所有操作结果被保留;要么中止,则所有操作结果被撤消。不存在第三种情况。

?

C(一致性):数据总是要保持逻辑正确性,所有规则和约束必需被执行。

?

I(隔离性):并发事务会与其它未完成事务的更新操作相隔离。如果不隔离就会产生错误的结果。假设要把10更新成20,当操作正在进行时,

? ? ? ? ? ? ? ? ?突然并发一个查询“更新后的数据”的操作,之后更新操作被中止了,那之前并发的那个查询结果就成了一个实际上不存在数据。

?

D(持久性):当事务提交成功,持久性就保证事务的作用会一直存在。不会因为停电,系统崩溃等等而丢失。

?

事务还会表现出一些可能的行为:

?? 丢失更新:当两个进程读取相同数据并修改它们,然后更新,这时第二个进程可能会完全覆盖掉第一个进程所做的更新。

?

?? 脏?? 读:当一个进程修改了某个数据,并未提交时,另一个进程读取到了这个修改后的数据(这种读取就叫脏读),之后第一个进程的事务被撤消,

? ? ? ? ? ? ? ?修改并未生效。那第二个进程读的数据就是逻辑上不存的数据。这会造成不一致状态的发生。

?

? 不可重复读:一个事务需要分两次读取同一个数据,但是在两次读取的间隔时间内某个进程修改了这个数据,造成两读取同一个数据却得到不同的值。

?

????? 幻? 读: 这个发生在一个事务中两次执行同一个带有谓词的查询时。比如查询字段A值小于10的所有行(where A<10),

? ? ? ? ? ? ? ? ? 第一次查询得到10行,接着插入了一个新行并且字段A的值小10,那么第二次查询时就会得到11行,造成两次结果不一样。

--------------------------------------------

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读