并发控制-简单总结

预期读者

    1. 初学者。

    2. 想复习的人。

    3. 原来学习并发觉得太复杂,没搞清楚,想以更简单的方式学习的人。

    4. 懒得总结的人。

 

    下面,我就以一个比较简单的方式来总结,和你们分享。:)



 

目标

    并发控制要做的是协调并发事务的执行,保证数据完整不受破坏,同时避免用户得到不正确的数据。主要目标有以下两个:

    1. 保证事务的特性:ACID(Automicity,Consistency,Isolation,Durability)。不再赘述。

    2. 尽量多的并发数。



问题

    并发操作如果不加任何控制,则可能存在以下的问题:

    1. 丢失更新。(“写”到“完”之间有另一人“写”)
    2. 读过时的数据。(“读”到“完”之间有另一人“写”)
    3. 读的数据。(“写”到“撤”之间有另一人“读”)

    括号里面的语句,使用比较接近本质的现象,来给前面的问题进行简单的描述或定义。



 

锁机制

 

    并发控制的主要方法是采用封锁技术:

    要解决问题1和3,我们需要在写的时候,不让其他人有任何的权限。这就设计出了第一种锁:排他型锁(X封锁)。这种锁只允许一个事务独享数据,其实事务只有等这个事务解除封锁后,才能对数据进行任何类型的封锁。

    要解决问题2,我们需要在读的时候,不让其他人有写的权限。这就有了第二种锁:共享型锁(S封锁)。我们可以理解为:排写型锁。

    这样一看,其实就是我们常用的读写锁,这是Net下我比较喜欢用的读写锁类:线程同步:System.Core中新的读写锁



 

封锁协议

    一级封锁协议。“事务T在修改数据R之前必须先对其加X锁,走到事务结束才释放。一级封锁协议可防止丢失更新,并保证事务T是可恢复的。但不能保证可重复读和不读脏数据。”。解决了1,没解决2、3,这是因为没有对读的事务进行任务控制。

    二级封锁协议。“一级封锁协议上加上事务T在读取数据R之前对其加S锁,读完后即可释放S锁。二级封锁协议可防止丢失更新,还可防止读脏数据。但不能保证可重复读。”。解决了1、3,没解决2,这是因为读后就释放,到事务完之前的这段时间有可能被写。

    三级封锁协议。“一级封锁协议上加上事务T在读取数据R之前对其加S锁,走到事务结束后才释放。三级封锁协议可防止丢失更新、防止读脏数据与数据可重复读。”。解决1,2,3,这是因为它弥补了二级封锁协议的缺点。

    两段封锁协议。“所有事务必须分两个阶段对数据项加锁和解锁。其中扩展阶段是在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;收缩阶段是在释放一个封锁之后,事务不能再申请和获得任何其他封锁。若并发执行的所有事务均遵守两段协议,则对这些事务的任何并发高度策略都是可串行化的(可以避免丢失更新、不可重复读和读脏数据等问题)。遵守两段封锁协议的事务可能会发生死锁”。解决了1,2,3,却可能会死锁原因:“串行化”方案自然可以解决与之含义相反的“并发”所带来的问题,但是同时因为它其实已经不是并发了,所以也就不可能达到第二个目标:“高并发”。死锁发生在两个事务在扩展阶段都想要申请对方已经拥有的资源。



 

结束语

    上面的并发方案是比较基础型的,所以并未提及应用级别的乐观锁、悲观锁等。从问题出发,理解锁的设计原理,再理解封锁协议的设计原理,可以让我们在应用的时候,根据不同的情况,选择不同的锁机制和封锁协议以满足不同的需求。这个才是最终的目的

    因为打算明年试试去考一个职称,再加上也想扎实一下一些很有用的基础知识,所以最近开始看《系统架构设计师考试全程指导》这本书。中途学到并发时,感觉很难想明白为什么会有这些锁,为什么会有这些协议,为什么每个协议就可以解决这些特定的问题。所以花了些时间研究了下,写出来和大家分享。上面许多原因是基于我的理解,如果不对的话,欢迎拍砖,并指出错误的原因。谢谢。:)

时间: 2024-10-30 04:01:55

并发控制-简单总结的相关文章

PostgreSQL Daily Maintenance - vacuum

PostgreSQL数据库日常维护需要维护哪些东西, 和数据库中的业务类型有莫大的关系. PostgreSQL的并发控制简单来说是通过多tuple版本, tuple infomask信息, 事务提交状态以及事务snapshot来实现的. 当删除一条记录时, 并不是马上回收被删除的空间, 因为有可能其他事务还会用到它, 当更新一条记录是, 老的记录会保留, 然后插入新的记录. 例如 : digoal=# create table tbl(id int, info text); CREATE TAB

NHibernate之旅(7):初步探索NHibernate中的并发控制

本节内容 什么是并发控制? 悲观并发控制(Pessimistic Concurrency) 乐观并发控制(Optimistic Concurrency) NHibernate支持乐观并发控制 实例分析 结语 什么是并发控制? 当许多人试图同时修改数据库中的数据时,必须实现一个控制系统,使一个人所做的修改不会对他人所做的修改产生负面影响.这称为并发控制. 简单的理解就是2个或多个用者同时编辑相同的数据.这里的用者可能是:实际用户.不同服务.不同的代码段(使用多线程),及其在断开式和连接式情况下可能

简单介绍MySQL中的事务机制

  从一个问题开始 最近银行这个事情闹的比较厉害啊,很多储户的钱放在银行,就不翼而飞了,而银行还不管不问,说是用户的责任,打官司,用户还能输了,这就是"社会主义".咱还是少发牢骚,多种树,莫谈国事. 说到银行存钱,就不得不说一下从银行取钱这件事情,从ATM机取钱这件简单的事情,实际上主要分为以下几个步骤: 登陆ATM机,输入密码; 连接数据库,验证密码; 验证成功,获得用户信息,比如存款余额等; 用户输入需要取款的金额,按下确认键; 从后台数据库中减掉用户账户上的对应金额; ATM吐出

创建代码生成器可以很简单:如何通过T4模板生成代码?[上篇]

在<基于T4的代码生成方式>中,我对T4模板的组成结构.语法,以及T4引擎的工作原理进行了大体的介绍,并且编写了一个T4模板实现了如何将一个XML转变成C#代码.为了让由此需求的读者对T4有更深的了解,我们通过T4来做一些更加实际的事情--SQL Generator.在这里,我们可以通过SQL Generator为某个数据表自动生成进行插入.修改和删除的存储过程.[文中源代码从这里下载] 一.代码生成器的最终使用效果 我们首先来看看通过直接适用我们基于T4的SQL生成模板达到的效果.右图(点击

Java并发控制机制详解

在一般性开发中,笔者经常看到很多同学在对待java并发开发模型中只会使用一些基础的方法.比如Volatile,synchronized.像Lock和atomic这类高级并发包很多人并不经常使用.我想大部分原因都是来之于对原理的不熟悉导致的.在繁忙的开发工作中,又有谁会很准确的把握和使用正确的并发模型呢? 所以最近基于这个思想,作者打算把并发控制机制这部分整理成一篇文章.既是对自己掌握知识的一个回忆,也是希望这篇讲到的内容能帮助到大部分开发者. 并行程序开发不可避免地要涉及多线程.多任务的协作和数

Java线程并发控制基础知识

线程池 推荐用ThreadPoolExecutor的工厂构造类Executors来管理线程池,线程复用线程池开销较每次申请新线程小,具体看代码以及注释 public class TestThread { /** * 使用线程池的方式是复用线程的(推荐) * 而不使用线程池的方式是每次都要创建线程 * Executors.newCachedThreadPool(),该方法返回的线程池是没有线程上限的,可能会导致过多的内存占用 * 建议使用Executors.newFixedThreadPool(n

MongoDB简单调研

背景         一直受传统RDB的影响,对于数据库表的设计可能大多数开发者都形成了思维定势.在云计算和大数据背景下,RDBMS正在接近极限,KV存储将受到越来越多的关注.学习NoSQL,不求能革RDBMS的命,但希望在设计思路上能得到一些拓宽,很多场景里,SQL表的设计和计算语句其实蛮难受的.        RDBMS天生不是分布式的,因其保持着ACID的特性发展至今,非常重视数据完整性,但在机器规模增长的情况下,ACID是不可扩展的.同时,随着数据量和访问频率增加,ACID所要维护的开销

PostgreSQL SQL 语言:并发控制

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 介绍 PostgreSQL为开发者提供了一组丰富的工具来管理对数据的并发访问.在内部,数据一致性通过使用一种多版本模型(多版本并发控制,MVCC)来维护.这就意味着每个 SQL 语句看到的都只是一小段时间之前的数据快照(一个数据库版本),而不管底层数据的当前状态.这样可以保护语句不会看到可能由其他在相同数据行上执行更新的并发事务造成的不一致数据,为每一个数据库会话提供事务隔离.MVCC避免了传统的数据库系统的锁定

[NHibernate]并发控制

目录 写在前面 文档与系列文章 并发控制 乐观并发控制(Optimistic Concurrency) 一个例子 悲观并发控制(Pessimistic Concurrency) 总结 写在前面 上篇文章介绍了nhibernate中的事务,在增删改查中使用的必要性.本篇文章将介绍nhibernate中的并发控制.对多人同时修改同一条数据,如何进行并发控制,在nhibernate中提供了一些方法来实现乐观并发控制. 文档与系列文章 [Nhibernate]体系结构 [NHibernate]ISess