企业应用架构模式学习(五):并发

前言

本节并发讲解多用户同时访问同一个数据时,引发的数据不一致性,数据失效性,即咱们开发中的事务处理以及版本控制。 web

并发问题

  • 更新丢失(lost updates):当两个用户同时操做一条数据时,A读取了数据进行操做,在A提交数据以前,B进行了数据的更改,若是A此时提交成功,则B修改的数据被丢失掉了。
  • 不一致性(inconsistent read):当用户A在访问多个数据时,因为时间较长,在此期间,另外一个用户B删除了其中的数据,此时A取到的数据就不是一致的。

执行语境

执行语境,从外界交互的角度看,有两个重要的执行语境:请求和会话。请求即调用,请求添加一个用户等等。会话是客户端和服务器端一次长时间的交互,能够是单独的请求,也能够是屡次请求组成的,如登录到添加用户。(session 保存会话状态) 数据库

隔离与不变性

并发的解决方案:隔离(isolation)、不变性(immutability) 安全

  • 隔离:对修改隔离,同一时刻只能一个用户修改,在用户对修改未提交或者放弃修改以前,其余用户都不能进行修改,修改独占,固然在web环境中实现难度较大,用户能够轻易的获取独占,可是放弃是难于捕获的,因此如今有行记录版本控制,非最新版本不能保存修改。
  • 不变性:分离数据中不变的地方。

乐观并发控制和悲观并发控制

  • 乐观锁:两我的都能获得一个文件的拷贝,均可以自由的编辑,先提交的先保存,后提交的有冲突则不能保存,咱们的svn都采用这种控制。(冲突监测)
  • 悲观锁:当A获得一个文件时,其余人不能修改。(冲突避免)

避免不一致读:

在读数据时添加读锁(read lock,共享锁),写数据添加写锁(write lock,排它锁),读锁发生时,可多人同时加锁,可是不能加写锁。另一种状况是,加了写锁,则都不能加上读锁。 服务器

死锁

当一个加上写锁以后,另外也要加上写锁,则只能等待到前一个完成以后,才能进行。死锁出现的缘由是人们在已经获得锁的状态下,还但愿获得更多的锁,因此防止死锁的发生就是强制人们一次性读取全部可能须要的锁,同时加上超时控制和检测机制处理。 session

事务

你们对事务都足够了解了,操做要么成功要么失败。事务有四个特性: 并发

ACID

  • 原子(atomicity)
  • 一致性(consistency)
  • 隔离性(isolation)
  • 持久性(durability)

事务资源

用事务资源来表示能够进行事务处理的任何事物—即便用事务来控制并发过程。(数据库控制事务,过程开启事务,结束事务) svn

减小事务隔离以提升灵活性

即事务的四个级别的选择: atom

隔离级别 spa

脏读 线程

不可重复读

幻读

读未提交

读已提交

可重复读

可串行化

 

业务事务和系统事务

系统事务即数据库自己要实现的事务处理,如写成功,业务事务为程序所定义的事务。

离线并发控制的模式

采用乐观离线锁,局限是:只能在提交数据时才发现业务事务将要失败,代价变大,输入了一个小时的东西,结果失败了。

应用服务器并发

咱们经常使用的web服务器都采用每个会话一个进程,采用线程安全。

 

 

并发是计算机系统必须面对的问题,无论在哪一个方面,即便在现实社会也不例外,咱们的大脑一次处理一个事情成功率高不少与一次处理多个事情,你们作饭的话会有很好的体会。

相关文章
相关标签/搜索