我相信很多朋友对于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
分享到:
相关推荐
在iOS应用开发中,线程(Threading)是...总之,"IOS应用源码——Threading.rar"为iOS开发者提供了一套学习和实践多线程技术的资源,涵盖了从基础的线程模型到更高级的并发控制策略,是提升iOS开发技能的重要参考资料。
在这个例子中,我们将深入探讨如何使用`socketserver`进行并发编程,特别是通过`ThreadingTCPServer`来处理多个客户端的并发连接。 首先,`socketserver`模块主要包含两类类:Server类和Request类。Server类主要...
"Java工程师成神之路2020版——高级篇.png"则深入到更复杂的主题,比如反射机制、动态代理、JVM内存模型、垃圾回收机制、性能优化、多线程高级应用、NIO(非阻塞I/O)以及设计模式(如工厂模式、单例模式、装饰器...
MySQL的64位版本尤其适合需要处理大量数据或者需要高并发操作的应用场景,因为64位系统可以支持更大的内存,使得数据库能够处理更大规模的数据集。此外,64位MySQL还可以利用更多的处理器核心,提供更高的并行处理...
4. **活动图(Activity Diagrams)**:活动图类似于流程图,用于描述多个对象的并发行为,特别是处理业务流程或工作流。它可以展现一个特征或需求的活动流程。 总的来说,UML提供了一套全面的图形工具,使软件开发...
- **响应式编程支持**:SpringBoot2.x引入了对响应式编程的支持,这使得开发异步非阻塞的应用成为可能,提高了系统的并发处理能力。 - **SpringData响应式支持**:SpringData模块也进行了更新,以适应响应式编程...
- Calendar继承自AbstractCalendar,并实现了Calendar接口,提供了一套完整的日期和时间字段(如年、月、日、小时等)以及相关的操作方法。 2. **字段和枚举类型**: - Calendar类定义了多个枚举类型,如FIELD_...
这个系统设计为高可用性,适合高并发场景,包含了丰富的功能模块,如会员管理、第三方登录、第三方支付、订单处理、分销系统、文章管理、系统设置以及流量分析等。 系统的技术栈主要包括以下几个方面: 1. **...
并发编程——认识 Java 里面的线程 在 Java 编程中,并发编程是一个非常重要的概念。Java 程序天生就是多线程的,main 方法开始执行后,按照既定的代码逻辑执行,看似没有其他线程参与,但实际上 Java 程序天生就是...
这个压缩包 "安卓Android源码——FFMpeg.rar" 很可能包含了一个将 FFmpeg 集成到 Android 应用中的示例源代码。 FFmpeg 的主要组件包括: 1. **libavcodec**:这是 FFmpeg 的核心编码库,提供了各种音频和视频编码...
在秋招过程中,面试主要考察了应聘者对计算机科学基础知识、Java编程语言、并发编程、数据库、网络协议、操作系统以及面试技巧的理解。以下是对这些知识点的详细解析: 1. **Java基本数据类型**:Java有8种基本数据...
Node.js的非阻塞I/O模型也是其一大特点,它利用事件驱动和回调函数实现高并发处理,使得Node.js特别适合构建高性能的网络应用,如实时聊天系统、流媒体服务和API服务器等。 总的来说,Node.js通过结合JavaScript和...
2 自己的系统调用,只有系统调用实现的代码,系统调用需要自己编译内核 3 字符设备驱动的编写(含代码和makefile) 4 GTK编写系统监视器,可以监测系统很多方面(含代码和makefile) 5 虚拟文件系统(实现的比较简单...
本文将深入探讨两种常见的存储引擎——InnoDB和MyISAM,并分析它们的主要区别。 InnoDB存储引擎是MySQL的默认引擎,尤其在高并发和事务处理的场景下被广泛使用。InnoDB的最大特点是它支持事务处理(ACID属性:原子...
在处理重复(并发)请求时,特别是在涉及到数据库写入或关键操作的场景中,优雅的解决方案至关重要,因为重复请求可能导致数据一致性问题、资源浪费或用户体验下降。本文将探讨几种服务端处理这类问题的方法。 首先...
在iOS应用开发中,`NSOperation` 和 `NSOperationQueue` 是两个非常重要的概念,它们是Apple提供的用于执行异步任务和管理并发的框架。在`IOS应用源码——NSOperationTest.zip`这个项目中,我们可以深入理解并实践这...
这个"ASP.NET源码——phpFreeChat.zip"文件显然包含了使用ASP.NET技术实现的一个聊天室应用的源代码,名为phpFreeChat。在深入探讨之前,我们需要明确一点:尽管名称包含“php”,但这里的“phpFreeChat”很可能是指...
Java多线程处理数据是一种常见的优化策略,尤其在面临大量数据查询时,通过并发执行任务可以显著提升程序的运行效率。以下将详细解释这个程序中的关键知识点: 1. **Callable接口**:`ThredQuery`类实现了`Callable...
2. **数据管理的三个阶段**: - **人工管理**:数据分散、不规范,管理效率低。 - **文件系统**:数据部分结构化,管理较前一阶段进步。 - **数据库系统**:数据结构化,高共享、低冗余,支持数据独立性。 3. **...
在本篇关于“Netty框架学习——第一个Netty应用”的文章中,我们将深入理解如何使用Netty构建一个简单的Echo服务器和客户端。Netty是一个高性能、异步事件驱动的网络应用程序框架,广泛应用于Java领域的服务器开发。...