[quote]文章内容摘自Martin Fowler[url]http://martinfowler.com[/url]先生著作的中译本。
英文书名:[b]Patterns of Enterprise Application Architecture[/b]
中文书名:[b]企业应用架构模式[/b]
翻译:王怀民、周斌
ISBN:9787-111-30393-0
[/quote]
[size=large]并发的本质问题[/size]
并发本质问题是更新丢失和不一致读。
更新丢失发生在一方修改资源但未提交之前另一方对同一资源提交更新。比如,两个开发人员对同一版本的一个文件进行更新,其中一人增加了一些注释并先提交,另一人增加了代码并稍后提交,第一人提交的注释就会丢失。
不一致读发生在一方分别读取若干资源同时有另一方修改这些资源。比如,一人要统计两个目录下的文件总数,在数完一目录下的7个文件后开始数下一目录之前,另一人在两目录下都增加了2个文件,接着数第二个目录发现8个文件,统计结果是15个文件,这个结果不对,应该是13或17。
执行语境
一次会话,一次请求,一个进程,一个线程。
隔离与不变性
解决并发问题的两个重要解决方案是隔离和不变性。
乐观并发控制和悲观并发控制。
乐观锁策略认为并发的情况少,提交时做版本检查。悲观锁认为并发机率高,修改之前进行锁定。
事务
ACID 原子性,一致性,隔离性,持久性。
事务资源,可以用来进行事务处理的任何事物,比如数据库。
SQL标准的四个事务隔离级别
可以串行化,可以重复读,读已提交,读未提交
可以串行化最高,读未提交最低
可以重复读保证在一个事务内多次读取同一资源的结果相同,这有可能造成幻读,比如在读取一个集合时,其他事务提交了新元素,就会得到一部分旧元素和一部分新元素,在系统中并没有这样的集合。
读已提交保证没次都读取到最新提交的结果,他允许不可重复读现象
读未提交允许读取其他事务中未提交的数据,他允许脏读。
离线并发问题
事务资源中的事务是系统事务,用户可见的是业务事务。一个业务事务可跨多个系统事务,保证这种事务ACID属性的问题称作离线并发问题。
原子性和持久性的支持:在业务事务提交阶段开始一个系统事务保存所有数据。
隔离性和一致性的支持,很难
并发控制首选乐观锁,其次悲观锁。
应用服务器并发
每会话一进程,没会话一线程。
英文书名:[b]Patterns of Enterprise Application Architecture[/b]
中文书名:[b]企业应用架构模式[/b]
翻译:王怀民、周斌
ISBN:9787-111-30393-0
[/quote]
[size=large]并发的本质问题[/size]
并发本质问题是更新丢失和不一致读。
更新丢失发生在一方修改资源但未提交之前另一方对同一资源提交更新。比如,两个开发人员对同一版本的一个文件进行更新,其中一人增加了一些注释并先提交,另一人增加了代码并稍后提交,第一人提交的注释就会丢失。
不一致读发生在一方分别读取若干资源同时有另一方修改这些资源。比如,一人要统计两个目录下的文件总数,在数完一目录下的7个文件后开始数下一目录之前,另一人在两目录下都增加了2个文件,接着数第二个目录发现8个文件,统计结果是15个文件,这个结果不对,应该是13或17。
执行语境
一次会话,一次请求,一个进程,一个线程。
隔离与不变性
解决并发问题的两个重要解决方案是隔离和不变性。
乐观并发控制和悲观并发控制。
乐观锁策略认为并发的情况少,提交时做版本检查。悲观锁认为并发机率高,修改之前进行锁定。
事务
ACID 原子性,一致性,隔离性,持久性。
事务资源,可以用来进行事务处理的任何事物,比如数据库。
SQL标准的四个事务隔离级别
可以串行化,可以重复读,读已提交,读未提交
可以串行化最高,读未提交最低
可以重复读保证在一个事务内多次读取同一资源的结果相同,这有可能造成幻读,比如在读取一个集合时,其他事务提交了新元素,就会得到一部分旧元素和一部分新元素,在系统中并没有这样的集合。
读已提交保证没次都读取到最新提交的结果,他允许不可重复读现象
读未提交允许读取其他事务中未提交的数据,他允许脏读。
离线并发问题
事务资源中的事务是系统事务,用户可见的是业务事务。一个业务事务可跨多个系统事务,保证这种事务ACID属性的问题称作离线并发问题。
原子性和持久性的支持:在业务事务提交阶段开始一个系统事务保存所有数据。
隔离性和一致性的支持,很难
并发控制首选乐观锁,其次悲观锁。
应用服务器并发
每会话一进程,没会话一线程。