介绍
DBMS 中的并发性是指系统能够同时支持多个事务而没有任何数据丢失或损坏的能力。在并发系统中,许多事务可以同时访问和修改数据。每个事务都与其他事务隔离,因此在提交第一个事务之前,一个事务所做的更改对其他事务不可见。
并发控制对于任何 DBMS 都至关重要,因为它允许系统在多个事务同时访问的情况下保持数据的一致性和完整性。我们可以使用各种并发控制算法来确保数据在现代系统中正确更新。
什么是数据库管理系统?
它是一个数据库管理系统,一种与最终用户、其他应用程序和数据库交互以捕获和分析数据的计算机软件应用程序。通用 DBMS 旨在允许定义、创建、查询、更新和管理数据库。
1. 数据库是以特定方式组织的数据集合。DBMS 软件允许我们创建、查询和更新数据库。
2. DBMS 的三种主要类型是关系型、面向对象型和图形数据库。
3. 关系数据库是最流行的 DBMS 类型。它们将数据存储在表中,您可以使用SQL来查询数据。
4. 面向对象的数据库将数据存储为对象。您可以使用面向对象的编程语言来查询数据。
5. 图数据库将数据存储为节点和边。您可以使用图形算法来查询数据。

餐饮哲学家问题
哲学家进餐问题是并发问题的典型例子。Edsger Dijkstra 于 1965 年首次提出该问题。这是一个处理对共享资源的同步访问的问题。
哲学家进餐问题是计算机科学中的经典问题,经常被用来说明并发和同步的原理。问题很简单:五位哲学家围坐在一张桌子旁,每人拿着一盘食物。要吃饭,哲学家必须先拿起盘子左右的筷子。一旦获得了两根筷子,哲学家就可以吃饭了。问题是,如果所有的哲学家都试图同时拿起筷子,有些人最终会用一根筷子吃不下饭。
问题设置如下:
1. 五位哲学家围坐在一张桌子旁。
2. 每个哲学家面前都有一盘食物。
3. 哲学家要吃饭,必须先拿起左边的叉子,然后再拿起右边的叉子。
4. 拿起两个叉子后,哲学家就可以吃饭了。
5. 吃完饭后,哲学家必须放下两把叉子,然后再拿起它们。
6. 问题是,如果所有哲学家同时拿起他们的左叉子,他们都将等待另一位哲学家拿着的叉子在他们的右边。会导致死锁。

DBMS 中解决哲学家进餐问题的方法:
DBMS 中解决哲学家进餐问题的方法有很多。一些更常见的方法是:
1. 每个哲学家使用一个锁:每个哲学家都有一个锁。当哲学家想要拿起一个叉子时,他们必须首先获得该叉子的锁和相邻叉子的锁。一旦获得了两把锁,哲学家就可以拿起两把叉子吃饭。这种方法保证没有两个哲学家可以同时吃饭,但是如果所有哲学家都试图同时为第一个分叉获取锁,它可能会导致死锁。
2.使用全局锁:所有哲学家共享一个锁。当哲学家想要拿起一个叉子时,他们必须首先获得全局锁。一旦获得全局锁,哲学家就可以拿起两个叉子吃饭。这种方法保证没有两个哲学家可以同时吃饭,但如果始终持有全局锁,可能会导致饥饿
哲学家就餐问题有很多解决方案,但最流行的是信号量解决方案。在这个解决方案中,每个哲学家都被赋予了一个信号量。信号量用来表示筷子。如果一个哲学家想吃东西,他会首先尝试获得两个信号量。如果他能获得两个信号量,那么他就可以吃东西了。如果他不能获得两个信号量,他会一直等到可以。
解决哲学家就餐问题
的伪代码:哲学家存在于思考、饥饿和饮食阶段。Mutex 和哲学家的信号量数组是这里出现的两个信号量。由于互斥锁的使用,没有两个哲学家可以同时访问或放下它。该数组管理每个哲学家的行为。
进程 P[i]
虽然真的做
{ 思考;
PICKUP(筷子[i],筷子[i+1 mod 5]);
吃;
放下(筷子[i],筷子[i+1 mod 5])
}生产者消费者问题
在计算机科学中,生产者-消费者问题(也称为有界缓冲区问题)是多进程同步问题的经典示例。该问题描述了两个进程,生产者和消费者,它们共享一个标准的、固定大小的缓冲区,用作队列。
是什么导致 DBMS 中的生产者消费者问题:
使用数据库时最常见的问题之一是所谓的“生产者-消费者问题”。
当需要将两个或多个读写过程同步到同一个数据源时,就会出现生产者-消费者问题。本质上,问题在于生产者(即,正在写入数据源的进程)写入数据的速度比消费者(即,正在从数据源读取的进程)读取数据的速度要快。
它可能导致几个问题,例如消费者读取不完整的数据或生产者覆盖消费者尚未读取的数据。
有几种方法可以解决生产者-消费者问题,例如使用队列来存储生产者已写入消费者尚未处理的数据。

解决 DB 中生产者消费者问题的方法:
DBMS 中的生产者-消费者问题有多种解决方案。一些流行的方法如下:
1)共享内存:在这种方法中,生产者和消费者共享一个公共的内存空间。生产者生成数据并将其存储在共享内存中。消费者然后使用共享内存中的数据。
2)消息传递:在这种方法中,生产者和消费者之间通过消息传递进行通信。生产者生产数据并通过消息将其发送给消费者。消费者然后消费数据并向生产者发送回复消息。
3) 数据库:在这种方法中,生产者和消费者访问共享数据库。生产者产生数据并将其存储在数据库中。然后消费者使用数据库中的数据。
解决 DBMS 中的生产者消费者问题的著名应用程序:在 DBMS
中有很多方法可以对生产者-消费者问题进行编码。一种方法是使用 Java 消息服务 (JMS)。JMS 是一个标准,它定义了面向消息的应用程序如何相互通信。它通常用于企业应用程序中,以允许不同的应用程序相互通信。
在 DBMS 中编写生产者-消费者问题的另一种方法是使用 Apache Kafka 消息系统。Kafka 是一个分布式、可扩展和容错的消息传递系统。它通常用于大容量数据管道中以在不同系统之间移动数据。
生产者-消费者问题也可以用其他语言编码,例如 Python 或 C++。
伪代码
一个称为信号量 S 的整数变量只能使用两个标准过程 wait() 和 signal() 来访问。
signal() 函数将信号量的值提高 1,而 wait() 方法将其降低 1。
等待(S){
而(S<=0);// 忙着等待
S--;
}
信号(S){
S++;
}结论
在本文中,我们讨论了数据库管理系统中出现的著名并发问题。数据库管理系统 (DBMS) 中可能发生并发问题的几个原因。首先,如果两个或更多用户试图同时访问相同的数据,他们最终可能会覆盖彼此的更改。其次,如果一个用户试图更新另一个用户已经更新的数据,第一个用户的更改可能会丢失。最后,如果两个用户试图同时编辑相同的数据,其中一个更新可能会丢失。
本文的主要观点:
1. 首先,我们讨论了并发以及它为什么会出现在 DBMS 中。
2.我们详细讨论了餐饮哲学家的问题,其原因,预防方法和伪代码。
3. 最后,我们讨论了另一个著名的问题,即生产者-消费者问题。我们讨论了它的原因、防止它的方法和伪代码。
原文标题:Famous Concurrency Problems in DBMS
原文作者:Aditya Garg
原文链接:https://www.analyticsvidhya.com/blog/2022/10/famous-concurrency-problems-in-dbms/




