本节并发讲解多用户同时访问同一个数据时,引发的数据不一致性,数据失效性,即咱们开发中的事务处理以及版本控制。 web
执行语境,从外界交互的角度看,有两个重要的执行语境:请求和会话。请求即调用,请求添加一个用户等等。会话是客户端和服务器端一次长时间的交互,能够是单独的请求,也能够是屡次请求组成的,如登录到添加用户。(session 保存会话状态) 数据库
并发的解决方案:隔离(isolation)、不变性(immutability) 安全
在读数据时添加读锁(read lock,共享锁),写数据添加写锁(write lock,排它锁),读锁发生时,可多人同时加锁,可是不能加写锁。另一种状况是,加了写锁,则都不能加上读锁。 服务器
当一个加上写锁以后,另外也要加上写锁,则只能等待到前一个完成以后,才能进行。死锁出现的缘由是人们在已经获得锁的状态下,还但愿获得更多的锁,因此防止死锁的发生就是强制人们一次性读取全部可能须要的锁,同时加上超时控制和检测机制处理。 session
你们对事务都足够了解了,操做要么成功要么失败。事务有四个特性: 并发
用事务资源来表示能够进行事务处理的任何事物—即便用事务来控制并发过程。(数据库控制事务,过程开启事务,结束事务) svn
即事务的四个级别的选择: atom
隔离级别 spa |
脏读 线程 |
不可重复读 |
幻读 |
读未提交 |
是 |
是 |
是 |
读已提交 |
否 |
是 |
是 |
可重复读 |
否 |
否 |
是 |
可串行化 |
否 |
否 |
否 |
系统事务即数据库自己要实现的事务处理,如写成功,业务事务为程序所定义的事务。
采用乐观离线锁,局限是:只能在提交数据时才发现业务事务将要失败,代价变大,输入了一个小时的东西,结果失败了。
咱们经常使用的web服务器都采用每个会话一个进程,采用线程安全。
并发是计算机系统必须面对的问题,无论在哪一个方面,即便在现实社会也不例外,咱们的大脑一次处理一个事情成功率高不少与一次处理多个事情,你们作饭的话会有很好的体会。