`
liangguanhui
  • 浏览: 112497 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

自斟自饮——2. 简单的并发堵塞回顾

阅读更多



我相信很多朋友对于SQL本身是没什么问题的,但在多用户并发的情况下到底会是如何一个境况,我相信不少人应该还是一头雾水……

(1)在Informix下,
insert into mpolicy select * from mpolicy;

你觉得这条语句的执行结果会使怎么样?如果在mysql(innodb)、oracle、PostgreSQL呢?


(2)在informix下,假设开始的时候,mpolicy没有一个1000 polno的policy,然后开两个dbaccess,然后在第一个执行
begin work;
insert into mpolicy (polno) values (1000);
--记住最后不要commit,也不要关闭窗口,先hold住;



(3)在informix下,假设开始的时候,mpolicy没有一个1000 polno的policy,然后开两个dbaccess,然后在第一个执行
begin work;
insert into mpolicy (polno) values (1000);
--记住最后不要commit,也不要关闭窗口,先hold住;



(4)在informix下,假设开始的时候,mpolicy没有1000和1001 polno的policy,然后开两个dbaccess,然后在第一个执行
begin work;
insert into mpolicy (polno) values (1000);
commit work;  --注意这里提交了一次
begin work;
update mpolicy set polno = 1001 where polno = 1000;
--记住最后不要commit,也不要关闭窗口,先hold住;


然后在第二个里面执行:
begin work;
update mpolicy set polno = 1001 where polno = 1000;
commit work;

你觉得在第二个dbaccess 在执行完begin work之后的剩下两条语句的执行结果会是怎样?第一个dbaccess会有什么相应的变化吗?如果在mysql(innodb)、oracle、PostgreSQL呢?


(5)在informix下,假设开始的时候,mpolicy没有1000和1001 polno的policy,然后开两个dbaccess,然后在第一个执行
begin work;
insert into mpolicy (polno, laname) values (1000, 'ft 0'); 
insert into mpolicy (polno, laname) values (1001, 'ft 1');
commit work;  --注意这里提交了一次
begin work;
update mpolicy set laname = 'ft 1000' where polno = 1000;
--记住最后不要commit,先hold住;


然后在第二个里面执行:
begin work;
update mpolicy set laname = 'ft 2001' where polno = 1001;
--记住最后不要commit,先hold住; 


然后范围刚才第一个dbaccess,继续执行:
update mpolicy set laname = 'ft 1001' where polno = 1001;
--记住最后不要commit,先hold住;


然后又返回第二个里面继续执行:
begin work;
update mpolicy set laname = 'ft 2000' where polno = 1000;


你觉得在第二个dbaccess执行完update之后,结果会是怎样?第一个dbaccess会有什么相应的变化吗?如果在mysql(innodb)、oracle、PostgreSQL呢?





































(1)基本上现代数据库都可以正确执行,执行结果都是把原来的数据copy多一份。但informix的实现机制跟另外三个有点不同。informix的实现是利用临时表作过渡,类似于分两步走,先把mpolicy的数据先插到一个临时表,然后再插回来mpolicy。而其余三个数据库因为有MVCC(Multiple Version Concurrency Control,多版本并发控制),所以不需要临时表作过渡。

另外默认情况下,informix的读写会互相读塞。也就是说,在informix把mpolicy数据插到临时表的过程,其他连接是不能insert或者update这个表的,但可以查询,因为informix会为这个表默认添加一个表级share锁。而把临时表数据插会到mpolicy的时候,会默认添加一个表级exclusive锁,换言之,其他连接不仅不能insert或者update这个表的,查询也不可以。

而Oracle等具备MVCC功能的则不存在这种并发上的限制。
(注意:Oracle从v3就开始支持MVCC,而DB2则是在v9.7才支持,SQL Server在2005才支持,但注意,为了保持先前兼容,DB2和SQLServer的MVCC选项默认是没有打开的。而Informix就不太清楚,好像到v12还没有支持)


(2)正如上面所说,Oracle等因为具备MVCC,所以读写不会互相堵塞,第二个连接的查询不会受到第一个连接的影响。第二个连接的查询结果是no result return.

但informix就不同了,当第一个连接插入polNo= 1000的时候,这一条数据实际上已经加了exclusive锁,于是第二个连接读取这条record的时候就会被堵塞,直到第一个连接commit或者rollback。如果第一个连接commit,那就会返回一条结果;如果第一个连接rollback,那也是no result return.

Informix要实现不堵塞读,只能是set isolation to uncommitted read;如果设置了这一句,查询会立即完成,返回一条数据。(这种情况就是典型的“脏读”,dirty read)


(3)四个数据库的结果都是一样,第二个连接在执行insert完之后立即堵塞,需要等地一个连接的进一步操作。如果第一个连接commit,那就会报错,因为重复主键了;如果第二个连接rollback,那第二个就会插入成功,继续往下面执行。(注意:这个跟MVCC是没有什么关系的)


(4)跟上面一题的情况类似,四个数据库的结果都是一样。


(5)这是一个典型的死锁,基本上现代数据库都可以轻易检测出来。结果会有一个连接报错,另外一个继续下去。上面的情形,通常都是第二个连接报错,第一个继续。
  • 大小: 41.3 KB
3
3
分享到:
评论

相关推荐

    IOS应用源码——Threading.rar

    在iOS应用开发中,线程(Threading)是...总之,"IOS应用源码——Threading.rar"为iOS开发者提供了一套学习和实践多线程技术的资源,涵盖了从基础的线程模型到更高级的并发控制策略,是提升iOS开发技能的重要参考资料。

    python-sockertserver并发编程思想(csdn)————程序.pdf

    在这个例子中,我们将深入探讨如何使用`socketserver`进行并发编程,特别是通过`ThreadingTCPServer`来处理多个客户端的并发连接。 首先,`socketserver`模块主要包含两类类:Server类和Request类。Server类主要...

    并发编程——Java线程的6种状态及切换(csdn)————程序.pdf

    并发编程——Java线程的6种状态及切换(csdn)————程序

    成神之路思维导图——Hollis.zip

    "Java工程师成神之路2020版——高级篇.png"则深入到更复杂的主题,比如反射机制、动态代理、JVM内存模型、垃圾回收机制、性能优化、多线程高级应用、NIO(非阻塞I/O)以及设计模式(如工厂模式、单例模式、装饰器...

    mysqlwinx64——downcc.zip

    MySQL的64位版本尤其适合需要处理大量数据或者需要高并发操作的应用场景,因为64位系统可以支持更大的内存,使得数据库能够处理更大规模的数据集。此外,64位MySQL还可以利用更多的处理器核心,提供更高的并行处理...

    UML————————概述.doc

    4. **活动图(Activity Diagrams)**:活动图类似于流程图,用于描述多个对象的并发行为,特别是处理业务流程或工作流。它可以展现一个特征或需求的活动流程。 总的来说,UML提供了一套全面的图形工具,使软件开发...

    【java框架】SpringBoot2(1) -- SpringBoot2入门及基础配置(csdn)————程序..pdf

    - **响应式编程支持**:SpringBoot2.x引入了对响应式编程的支持,这使得开发异步非阻塞的应用成为可能,提高了系统的并发处理能力。 - **SpringData响应式支持**:SpringData模块也进行了更新,以适应响应式编程...

    安卓Android源码——Calendar.rar

    - Calendar继承自AbstractCalendar,并实现了Calendar接口,提供了一套完整的日期和时间字段(如年、月、日、小时等)以及相关的操作方法。 2. **字段和枚举类型**: - Calendar类定义了多个枚举类型,如FIELD_...

    并发编程——认识java里的线程(csdn)————程序.pdf

    并发编程——认识 Java 里面的线程 在 Java 编程中,并发编程是一个非常重要的概念。Java 程序天生就是多线程的,main 方法开始执行后,按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是...

    python代码,用epoll处理socket并发(csdn)————程序.pdf

    在Python编程中,处理并发的网络连接通常会涉及到I/O多路复用技术,这里主要讲解的是使用`select.epoll()`来实现socket并发处理的方法。`epoll`是Linux内核提供的一种高效I/O事件通知机制,适用于大量并发连接的情况...

    Spring Boot 2.x基础教程:使用MongoDB(csdn)————程序.pdf

    Spring Boot 2.x 教程中的MongoDB使用详解 MongoDB是一个流行的NoSQL数据库系统,设计为分布式存储,提供高性能和可伸缩性。它的数据结构以BSON(Binary JSON)为主,允许存储复杂的数据类型,特别适合Node.js应用...

    安卓Android源码——FFMpeg.rar

    这个压缩包 "安卓Android源码——FFMpeg.rar" 很可能包含了一个将 FFmpeg 集成到 Android 应用中的示例源代码。 FFmpeg 的主要组件包括: 1. **libavcodec**:这是 FFmpeg 的核心编码库,提供了各种音频和视频编码...

    秋招面经和总结(csdn)————程序.pdf

    在秋招过程中,面试主要考察了应聘者对计算机科学基础知识、Java编程语言、并发编程、数据库、网络协议、操作系统以及面试技巧的理解。以下是对这些知识点的详细解析: 1. **Java基本数据类型**:Java有8种基本数据...

    node.js了解(csdn)————程序.pdf

    Node.js的非阻塞I/O模型也是其一大特点,它利用事件驱动和回调函数实现高并发处理,使得Node.js特别适合构建高性能的网络应用,如实时聊天系统、流媒体服务和API服务器等。 总的来说,Node.js通过结合JavaScript和...

    华中科技大学操作系统课程设计——1.多进程实现并发窗口

    2 自己的系统调用,只有系统调用实现的代码,系统调用需要自己编译内核 3 字符设备驱动的编写(含代码和makefile) 4 GTK编写系统监视器,可以监测系统很多方面(含代码和makefile) 5 虚拟文件系统(实现的比较简单...

    java 全端开源 电商系统 springboot uniapp 小程序 前后端分离 高可用(csdn)————程序..pdf

    这个系统设计为高可用性,适合高并发场景,包含了丰富的功能模块,如会员管理、第三方登录、第三方支付、订单处理、分销系统、文章管理、系统设置以及流量分析等。 系统的技术栈主要包括以下几个方面: 1. **...

    如何优雅地处理重复(并发)请求?(csdn)————程序.pdf

    在处理重复(并发)请求时,特别是在涉及到数据库写入或关键操作的场景中,优雅的解决方案至关重要,因为重复请求可能导致数据一致性问题、资源浪费或用户体验下降。本文将探讨几种服务端处理这类问题的方法。 首先...

    IOS应用源码——NSOperationTest.zip

    在iOS应用开发中,`NSOperation` 和 `NSOperationQueue` 是两个非常重要的概念,它们是Apple提供的用于执行异步任务和管理并发的框架。在`IOS应用源码——NSOperationTest.zip`这个项目中,我们可以深入理解并实践这...

    ASP.NET源码——phpFreeChat.zip

    这个"ASP.NET源码——phpFreeChat.zip"文件显然包含了使用ASP.NET技术实现的一个聊天室应用的源代码,名为phpFreeChat。在深入探讨之前,我们需要明确一点:尽管名称包含“php”,但这里的“phpFreeChat”很可能是指...

    java多线程处理数据(csdn)————程序.pdf

    Java多线程处理数据是一种常见的优化策略,尤其在面临大量数据查询时,通过并发执行任务可以显著提升程序的运行效率。以下将详细解释这个程序中的关键知识点: 1. **Callable接口**:`ThredQuery`类实现了`Callable...

Global site tag (gtag.js) - Google Analytics