`
韩悠悠
  • 浏览: 842411 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

3,并发

 
阅读更多

系统的许多交互并不是在一个数据库事物中完成的。这就要求在跨事物的数据处理中管理好并发问题,称为离线并发,
其含义是多数据库事物中数据操作的并发控制。
无论什么时候用多线程火多进程操作同一数据的时候,都会遇到并发问题,

更新丢失------
例如:A编辑了一个文件,对其中的checkConcurrency方法进行了修改,这个操作可能要花费几分钟的时间,与此同时,
B对相同文件的update方法也 进行了修改,B很快开始并完成他的修改,虽然他在A之后开始,但是却在A之前完成,很不幸,
A读的文件没有包括B的更新,因此当A写入文件时,就会覆盖B更新过的那个版本,B的更新就永远丢失了。


不一致读----------
发生在读取俩份各自正确的数据而他们却在同一时间互相矛盾时,例如:
M希望知道并发包中有多少个类,而该并发包有俩个子包,一个是加锁的,一个是多步提交的,M查了一下加锁包,有7个类,
这是,M接到ROY打来的电话,他们关于一些深奥的问题谈了很长时间,当M接电话的时候,D修改了四步锁代码中那个恼人
的错误,并在加锁包中加了俩个类并来只有5个类的多步提交包里多加了3个类,等到M接完电话再回去查多步提交包里有
多少个类的时候,她看到有8个类,总的加起来就是15个类。


以上这俩个问题都会导致正确性的失败,从而产生错误的行为。


隔离与不变性--------------------
并发问题由来已久,人们提出了各种不同的解决方案,对于企业应用来说,有俩个非常重要的解决方案,一个是隔离,一个是不变性。
并发问题发生在多个执行单元(例如进程或线程)同时访问同一片数据的时候,一个解决的办法就是隔离,划分数据,使得每一个
数据都只能被一个执行单元访问,操作系统为每个进程单独分配一片内存。并且只有这个进程可以对这片内存进行读或写操作。

只有在共享数据可以修改的情况下,并发问题才会发现,所以,一个避免并发冲突的方法是识别哪些是不变的数据。另一个观点是
把那些只读数据的程序分开来,让她们只使用拷贝的数据源,这样就可以放松所有的并发控制。


乐观锁并发控制与悲观锁并发控制-----------------------
当有一些数据无法隔离时,我们可以使用俩种形式的并发控制策略,乐观锁和悲观锁。
假设M和D同时都要编辑customer文件,如果使用乐观锁策略,她们俩个都可能得到一个文件的拷贝,并且可以自由编辑文件,假设D第一个完成
了工作,那么他可以毫无困难的更新他的修改,但是当M要提交他的修改的时候,并发控制策略就会开始作用,源代码控制系统会检测到在M修改
与D的修改之间存在着冲突,因而拒绝M的提交,并由M负责指出怎么样处理这种情况,
如果使用悲观锁,只要有人先取出文件,其他人就不能对该文件进行编辑,因此,假如M先取出文件,那么D就只能在M完成任务并提交之后才能对
该文件进行操作。

如果把乐观锁看做是关于冲突检测的,那么悲观锁就是关于冲突避免的。现实中大部分使用乐观锁。

在乐观锁和悲观锁之间进行选择的标准是:冲突的频率与严重性,如果冲突很少,或者冲突的后果不会很严重,那么通常情况下应该选择乐观锁,
因为它能得到更好的并发性,而且更容易实现,但是,如果冲突的结果对于用户来说很痛苦,那么就需要使用悲观锁策略。


避免不一致读-----------------
悲观锁策略可以通过读加锁和写加锁来处理不一致读,读数据的时候要一个读锁(read lock),写数据的时候,需要一个写锁(write lock)或者叫排他锁,
对于读锁,可以一次多个人对同一份数据加锁,但是只要有人得到了一个读锁,其他人都无法在得到一个写锁,另外一种情况,一旦有人得到一个写锁,
其他人就不能再得到这俩种锁的任何一种,在这类系统中可以使用悲观锁策略来避免不一致读问题。
乐观锁策略通常将冲突检测建立在数据的某种版本标记上,可能是时间戳,也可能是顺序计数器,为了检测到更新丢失,系统核对将要更新数据的版本标记
和共享数据的版本标记,如果俩者一样,系统允许更新数据并更新共享数据的版本标记。


死锁-----------------------

对于悲观锁技术有一个很特别的问题就是死锁,假设M开始编辑customer文件,而D开始编辑order文件,当D意识到如果要完成任务的话也需要编辑customer文件,
但是这时M已经对这个customer文件加锁了,所以D只好等待,然后M也意识到自己必须编辑order文件,同样D也已经对这个order文件加锁,现在他们之间出现了死锁,
除非有一个完成了,否则谁也无法继续,。

有许多不同的技术可以用来处理死锁,一种是使用软件来检测死锁的发生,在这种情况下,需要选择一个牺牲者,放弃他的工作和它所加的锁,一遍其他人可以继续,
另一种类似的方法就是给每一个锁都加上一个时间限制,一旦到达时间限制,所加的锁就会失效,但是会出现一个问题,在实际上没有死锁的情况下,有人会因为
持锁时间过长而成为牺牲者。

 

事物---------------------
在企业应用中处理并发最主要的工具就是事务,transaction
事务是一个有边界的工作序列,开始和结束都有明确定义,其次,所有相关资源在事务开始和结束时都保持一致,而且,每个事务都必须保证妖魔全部完成,要么什么都不做,
ACID
软件事务中经常使用ACID的属性来描述
原子性(A)在一个事务里,动作序列的每一个步骤都必须是要么全部成功,要么所有的工作都将回滚。
一致性(C)在事务开始和完成的时候,系统的资源都必须处于一致的,没有被破坏的状态。
隔离性(i) 一个事务,直到他被成功提交之后,他的结果对于任何其他的事务才是可见的。
持久性(D)一个已提交事务的任何结果都必须是永远性的,

分享到:
评论

相关推荐

    s3接口并发测试工具-上传与下载并发测试

    代码只有几行,实现s3上传并发与下载并发,是ceph s3接口测试工具。欢迎下载,需要3分哦。 s3接口并发测试工具 s3上传并发测试 s3下载并发测试 s3并发测试

    Python3并发写文件与Python对比

    Python3并发写文件的知识点主要包括以下几点: 1. Python3并发写文件原理解析:Python3在进行并发写文件操作时,无论是采用多进程还是多线程的方式,都不会出现文件内容混乱的问题,这是Python3的一个特性。而在...

    C#解决SQlite并发异常问题的方法(使用读写锁)

    本文实例讲述了C#解决SQlite并发异常问题的方法。分享给大家供大家参考,具体如下: 使用C#访问sqlite时,常会遇到多线程并发导致SQLITE数据库损坏的问题。 SQLite是文件级别的数据库,其锁也是文件级别的:多个线程...

    SP3_TCPIP并发连接数修改

    "SP3_TCPIP并发连接数修改"是指针对Windows XP Service Pack 3 (SP3) 版本的操作系统,调整TCP/IP设置以允许更多的并发连接。 默认情况下,Windows XP SP3的TCP/IP协议栈限制了系统的并发连接数量,这主要是为了...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全.mp4 1-6 并发编程的挑战之资源限制.mp4 2-1 进程与线程的区别.mp4 2-2 线程的状态及其相互转换.mp4 2-...

    Java并发编程-3.pdf

    3. Semaphore Semaphore 是一种同步工具,允许限制访问某些资源的线程数量。Semaphore 的构造函数接受一个整数参数,表示允许访问资源的线程数量。在上面的代码中,我们创建了一个 Semaphore 对象,初始值为 10,...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全.mp4 1-6 并发编程的挑战之资源限制.mp4 2-1 进程与线程的区别.mp4 2-2 线程的状态及其相互转换.mp4 2-...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全.mp4 1-6 并发编程的挑战之资源限制.mp4 2-1 进程与线程的区别.mp4 2-2 线程的状态及其相互转换.mp4 2-...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全.mp4 1-6 并发编程的挑战之资源限制.mp4 2-1 进程与线程的区别.mp4 2-2 线程的状态及其相互转换.mp4 2-...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载1.zip

    1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全.mp4 1-6 并发编程的挑战之资源限制.mp4 2-1 进程与线程的区别.mp4 2-2 线程的状态及其相互转换.mp4 2-...

    完结17章SpringBoot3+Vue3 开发高并发秒杀抢购系统

    本文采用先进的微服务架构,主流的前后端技术SpringBoot3+Vue3,从0到1带你全流程开发一个热门的高并发秒杀抢购三端(移动端、PC端、公众号)系统,并配套精美的UI界面,最终发布上线。让你实力迅速暴涨,收获一个极...

    s3-uploader:并发流式上传到 Amazon S3

    s3_uploader 使用并发、分段上传从 stdin 流式传输到 S3。 旨在用于传输数据相当缓慢的源(如 RDS 转储),因此获取初始数据是主要瓶颈。 使用并发分段上传尽可能快地上传大文件也很有用。 传统上(例如,使用 s3cmd...

    【资料】并发测试报告

    3. 并发测试脚本和场景设计: - 脚本编号和名称:脚本设计用于模拟用户操作,记录从输入网址到页面打开的响应时间。 - 场景设计:手动设计测试场景,逐步增加并发用户数直至达到预期的最大并发数。使用LoadRunner...

    帆软7.0.4并发补丁

    3. 安装:根据提供的安装指南,执行补丁安装程序,覆盖原有的文件或添加新的配置。 4. 配置:可能需要修改配置文件,如增加并发用户数或调整服务器参数,以适应更高的并发需求。 5. 验证:安装完成后,通过模拟多...

    XP SP3 TCPIP 并发连接数补丁

    在Windows XP SP2及SP3版本中,默认的TCP/IP并发连接数被限制为10个,这在一定程度上限制了系统的网络性能,特别是对于需要大量并发连接的应用(如P2P下载、网络爬虫或服务器应用)来说,这个限制可能成为瓶颈。...

    java并发编程2

    3. **线程同步机制** - **`synchronized` 关键字** 可以保证代码块或方法在同一时刻只有一个线程访问,防止数据不一致。 - ** volatile** 关键字 用于保证变量的可见性,但不保证原子性。 - **Lock接口与...

    java并发编程实战源码,java并发编程实战pdf,Java

    3. **并发控制**:Java提供了多种并发控制工具,包括synchronized、wait()、notify()、notifyAll()、ReentrantLock(可重入锁)、Semaphore(信号量)和CountDownLatch(倒计时器)等。这些工具用于协调不同线程的...

    WINXPSP3TCPIP最大并发连接数修改器

    标题中的“WINXPSP3TCPIP最大并发连接数修改器”指的是一个针对Windows XP Service Pack 3 (SP3) 操作系统的工具,该工具的主要功能是调整TCP/IP协议的最大并发连接数。在默认情况下,Windows XP SP3对TCP/IP的最大...

    内网并发测试工具

    3. **压力测试**:了解系统在极限情况下会如何反应,比如达到最大连接数或者内存使用量时,系统是否能正常工作。 4. **负载均衡**:在分布式系统中,内网并发测试可以验证负载均衡策略的有效性,确保请求被正确地...

Global site tag (gtag.js) - Google Analytics