数据库死锁,并发问题

数据库死锁,并发问题,第1张

补充楼主:

其实我没什么经验,只不过是了解一些基础的东西罢了。

一楼的 一朵瘩红花 实际经验很丰富,你可以向她咨询一下。

你问的问题挺好得。三个概念紧密联系在一起。

这样说吧:并发的几个事务同时发生,不加锁控制的话数据就会乱套了,而加了锁后,又是并发访问会出现死锁,所以就会出现避免死锁的一些措施。

首先谈并发:理论指的是在一段时间同时对某件事进行 *** 作。 注意精度问题,修改数据库是在一段时间内 *** 作,不是在某个时刻,而日志则会从 时刻 开始记录你的 *** 作。

造成死锁的原因是为了防止 不同的用户同时间(不是时刻)都对某个数据修改,造成访问不一致的问题。

比如你读了数据库的一个数据然后把它修改了并存回去,是需要时间的(假如是student表中的有个grade属性,你改了一条记录的一个值)在这个过程当中,有人又访问了数据库并且恰恰访问的是存回去之前的数据,然后他要进行 *** 作,过了一段时间,此时你已经存回去了数据。会发现原来的数据被改动了。这时数据就乱套了。(专业术语叫读脏数据,其实还有很多其他类似这种导致前后数据不一致的问题)所以为了限定这种 *** 作,数据库设计了-----锁---来锁定这种 *** 作。就是你正在 *** 作某个数据的时候----通常之前会先锁定这个数据,这样别人就不能对此数据 *** 作了(严格来说就是只能读,不能改),必须等你 *** 作完才能对此数据修改等 *** 作,这就在一定程度上避免了前后 *** 作数据不一致的问题。

但是有了锁后,新问题出现了,就是死锁:

简单解释死锁:进程A等待进程B释放他的资源,B又等待A释放他的资源,这样就互相等待就形成死锁

官方解释死锁

死锁,根本原因在于对共享存储区的访问。在数据库中也一样,如果需要“修改”一条数据,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改 *** 作。锁有多种实现方式,比如意向锁,共享-排他锁,锁表,树形协议,时间戳协议等等。锁还有多种粒度,比如可以在表上加锁,也可以在记录上加锁。

在并发控制中,锁是非常重要的。

至于在Oracle还是别的数据库管理系统中,死锁产生的原因没有不同,不同的顶多是锁的实现或者死锁的恢复等罢了

再来说说事务:

事务简单来说就是 一系列的对数据库的 *** 作揉在一起,要么同时完成,要么就都不完成。

比如---你要取钱的过程就可以当成是一个小的事务: 插卡,输入取钱金额,取走钱,拿出来卡。此过程缺一不可。把所有这些过程细节封装起来就成为一个事务。

以oracle数据库为例:

一个事务(你可以认为是一系列业务的 *** 作)起始于dml语句(insert、update、delete)

即一条dml语句就做为一个事务的起始,然后根据业务需要,进行其他的dml *** 作都算是事务的一部分。

最后碰到commit。或者rollback,或者其他意外什么的都算作一个事务的结束。

整个过程就是一个事务。

事务的理论解释就是那四个什么特性:什么原子性、一致性、隔离性和持久性

简称ACID

剩下的:数据库是建立在 *** 作系统之上的一个层次。

你问的是数据库的存储机制??工作机制??还是什么的??

数据库就是存数据的。数据库管理系统是 对存的数据进行高效率的管理

大的结构分物理数据跟逻辑数据。

物理数据就是数据在存储设备上的存储方式,什么物理联系,物理结构,物理记录等 术语。

逻辑数据就是程序员和用户看到的数据形式。什么逻辑联系,逻辑结构==同上

数据库管理类系统就是把这些逻辑跟物理相互转换。 好比你输入的叫逻辑数据存储在磁盘上叫物理数据。等等。

废话了一堆,也不知道回答对你的问题没~~

锁述的概

一. 为什么要引入锁

多个用户同时对数据库的并发 *** 作时会带来以下数据不一致的问题:

丢失更新

A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统

脏读

A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致

不可重复读

A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致

并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些 *** 作以避免产生数据不一致

二 锁的分类

锁的类别有两种分法:

1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁

MS-SQL Server 使用以下资源锁模式。

锁模式 描述

共享 (S) 用于不更改或不更新数据的 *** 作(只读 *** 作),如 SELECT 语句。

更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。

排它 (X) 用于数据修改 *** 作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

意向锁 用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。

架构锁 在执行依赖于表架构的 *** 作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。

大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/sjk/6665145.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存