长久以来,对数据库的各种隔离机制一直很模糊,总搞不清楚在别人眼里很简单的锁机制,事务隔离机制,最近查了一些资料,把自己对数据库的一些理解写下来,权当笔记,不对的地方希望大家指正。
为了确保并发用户在存取同一数据库对象时的正确性(即无丢失修改、可重复读、不读“脏”数据),数据库中引入了锁机制:
从数据库角度来说,数据库一般情况下会有以下两种锁类型:
1.排它锁(X锁):若事务T对数据D加X锁,则其它任何事务都不能再对D加任何类型的锁,直至T 释放D 上的X 锁;一般要求在修改数据前要向该数据加排它锁,所以排它锁又称为写锁,被写锁锁定的记录可以被无锁读取,比如在oracle中没有读锁的概念,在sqlserver中可以使用with nolock。
2.共享锁(S锁):若事务T对数据D加S 锁,则其它事务只能对D加 S锁,而不能加X 锁,直至 T 释放D 上的S 锁;一般要求在读取数据前要向该数据加共享锁,所以共享锁又称为读锁。
说明:因为任务事务在读取或者更改一条数据之前,都需要先申请相应的锁类型,所以一旦加上写锁,则其它事务只能等待该事务完成后才能申请相应的锁。一旦加上读锁(共享锁),则别的事务还可以对相同的数据申请共享锁,可以对数据进行读取,则不能修改,无锁读取在sqlserver 中可以使用select ...from ....with nolock。在oracle没有读锁概念。
其它锁概念:
悲观锁:指对于外界对数据的修改持保守态度,为了保持数据被操作的一致性,于是对数据采取了数据库层次的锁定状态,依靠数据库提供的锁机制来实现。该锁只是基于以上数据库提供的锁实现。
乐观锁:与“悲观锁”正好相反,该锁机制认为数据资料的存取很少发生冲突,采取了宽松的锁机制,一般情况下,乐观锁由开发者自行实现,一般情况下,开发者为数据库需要乐观锁的表增加一个版本字段或者时间戳字段,若记录要修改,则增加该记录的版本字段,在提交时与原数据进行比较,若大于则说明可以正常提交,否则说明该记录已经被修改,需要进行检查。时间戳也同样。
悲观锁说明:比如事务T1通过SQL语句"Select user.name from user as user where user.ID=1 for update"来查找记录,则此时满足条件的记录全部被锁定,若事务T2通过SQL语句“Selct user.name from user where user.ID=1 for update”,则事务T2只能等式待事务T1完成后才能执行。
在数据库原理中,又可以把读锁和写锁分为长锁和短锁:
长锁:在整个事务范围内,该锁都有效。比如事务T1中有对数据D1的长写锁,则表示在T1整个事务过程中,别的事务都无法取得对数据D1的更新权限,直到事务T1完成提交或者回滚。
短锁:只在数据查询的更新等操作时有效,数据操作完毕马上释放。释放完毕后,别的事务即可以申请对该数据的锁。
谓词锁:锁定满足查询条件
数据库的标准隔离级别及锁定义:
隔离级别 |
记录上的写锁是长期的 |
记录上的读锁是长期的 |
谓词上的读锁和写锁是长期的 |
Read Uncommitted |
否 |
无读锁 |
无谓词锁 |
Read Committed |
是 |
否 |
短期读谓词锁 长期写谓词锁 |
Repeatable Read |
是 |
是 |
短期读谓词锁 长期写谓词锁 |
Serilizable |
是 |
是 |
长期读谓词锁 长期写谓词锁 |
Read Uncommitted:标准定义中,在该级别中不允许存在更新操作,也就是说在该级别的所有事务都是只读的,但是这种级别允许读取别的事务已经更改但还没有提交的数据,这样就会导致脏读。比如事务A更改了user的用户名为userA,但是还未提交,但此种级别的事务B读取了该数据,但是事务A又失败了,导致回滚,这样事务B其实读到了无用的中间数据。
Read Committed:该级别会导致两种错误读取:
1.不可重复读取:假设事务A已经读取了某条数据,因为是短期读锁,导致事务A释放对数据的锁,此时事务B申请到了对事务A已经读取事务的写锁,并更改数据并提交,当事务A再次读取该数据时,数据已经改变。
2.更新丢失:比如事务A和事务B同时读取了某条数据,初始值都是100,事务A的意图是在100的基础上加上40,得到结果140,事务B的意思是在这条数据上增加50,按照正常的模式,得到的最终值应该是190,但是由于数据事务A和B都读到的是初始数据,事务A提交后,此时该数据应该是140,但是B已经读取了旧数据100,然后B再更新,导致结果150,这样就产生了错误的结果,序列如下:r1(a,100)r2(a,100)w1(a,140)c1 w2(a,150)c2,其中r1表示事务A的读,W1表示事务A的写,B也同样。
Repeatable Read:在该隔离机制下,屏蔽了以上会出现的问题。但是该级别使用了短期的读谓词锁,这样会导致幻像读取,比如事务A读取了ID>0的所有记录。数据库可能需要装入整装表逐个遍历该张表的所有记录,完成每一条记录的读取和where条件的比对,然后谓词读锁释放,但当此时,事务A未提交事务,此进事务B插入了一条数据满足ID>0,但是因为事务A已经释放了ID>0的谓词锁,会导致检测不到事务B的提交数据。这种幻像读在Serilizable中可以去除,因为在Seriliable中,使用了长期读谓词锁,这样事务B插入数据时,会导致锁冲突,从而避免了幻像读取。
以上只是本人对数据库的一些简单理解,如果有什么不正确的地方,欢迎大家指正。
分享到:
相关推荐
2009年的数据库系统工程师学习笔记可能涵盖了当时该领域的核心概念和技术。以下是对这些笔记可能包含的一些关键知识点的详细说明: 1. **数据库基础理论**: - 数据模型:包括关系模型(如SQL)、网络模型、层次...
本学习笔记旨在提供全面、深入的Oracle知识体系,帮助读者从基础到高级掌握Oracle数据库的使用。 首先,Oracle数据库的核心概念包括数据模型、数据库架构和SQL语言。数据模型是数据库设计的基础,主要包括实体、...
这份"超详细数据库系统与概论笔记2019上——个人笔记"的压缩包,包含了对《数据库系统与原理》一书的深度学习和理解。下面,我们将根据笔记内容,对数据库系统的基础知识进行深入探讨。 首先,数据库的绪论部分通常...
数据库并发控制是数据库管理系统在多用户环境中确保数据一致性的重要机制。在并发环境下,数据库系统需要处理多个事务同时访问和修改数据的问题,以防止数据不一致性的情况出现,如丢失修改、不可重复读和读脏数据。...
数据库系统通过锁机制、事务隔离级别等技术来实现事务并发的控制,确保多个事务之间不会产生冲突和干扰。 分布式数据库系统是指数据库分布在不同的物理地点,通过网络连接在一起协同工作的系统。分布式数据库系统...
这份"MySQL数据库学习笔记.zip"文件很可能包含了关于MySQL的基本概念、安装与配置、SQL语句、表的设计、索引、视图、存储过程、触发器、事务处理、备份与恢复等多方面的内容。下面我们将深入探讨这些关键知识点。 1...
数据库基础知识点学习是数据库管理系统(DBMS)的核心组成部分,涉及到数据库设计、关系数据库规范化、事务管理、数据库安全、数据库管理系统、数据独立性、事务并发控制、分布式数据库等多方面的知识点。...
本学习笔记旨在帮助读者深入理解数据库系统的基本概念、设计原理以及实际应用。 首先,数据库系统是管理和存储数据的软件系统,它包括数据库、数据库管理系统(DBMS)、数据库管理员(DBA)、硬件、软件以及相关的...
首先,"mysql学习笔记.doc"很可能是核心的学习资料,它可能包含了MySQL的基础概念、安装与配置、SQL语言基础、数据类型、数据库设计、表的创建与管理、索引、视图、存储过程、触发器、事务处理、备份与恢复、性能...
这些笔记涵盖了从基本概念到复杂操作的广泛内容,旨在帮助学习者深入理解如何有效地构建和操作数据库。 一、数据库设计基础 数据库设计首先涉及理解实体关系模型(ER模型),这是描述现实世界数据的图形表示。ER...
这篇“事物学习笔记一”主要聚焦于对数据库事务的理解,通过深入探讨其基本概念、特性以及在实际操作中的应用,帮助读者构建对这一核心概念的全面认识。 首先,我们需要理解什么是数据库事务。在数据库管理中,事务...
数据库事务是确保数据一致性的重要机制,遵循ACID特性:原子性、一致性、隔离性和持久性。事务的隔离性通过不同隔离级别来实现,SQL标准定义了四种隔离级别,以防止脏读、不可重复读和幻读等并发问题。在MySQL中,...
- 安全性:支持并发读取,通过锁机制确保数据一致性。 2. **Android中的SQLite使用**: - 创建数据库:通常有两种方式,一是通过`Context.createDatabase()`,二是通过`Context.openOrCreateDatabase()`,通常...
《成功之路Oracle11g学习笔记》是一本专为初学者设计的Oracle数据库学习资源,旨在帮助读者系统地掌握Oracle11g的基础知识。Oracle11g是Oracle公司推出的一个重要版本,它提供了许多增强的功能和优化,使得数据库...
6. 数据库事务与并发控制:讨论事务的ACID属性(原子性、一致性、隔离性和持久性),以及并发操作可能导致的问题及解决方案,如死锁和锁定机制。 7. 数据库恢复:如何在系统故障或错误后恢复数据库到一致状态,包括...
- 对开源数据库如MySQL、PostgreSQL等的研究,有助于深入理解其内部工作原理,如查询解析、存储引擎、锁机制等。 9. 数据库工具: - MySQL Workbench:图形化界面工具,用于数据库设计、管理和开发。 - Navicat...
总的来说,《鲁班学院数据库高级笔记》是一个全面而深入的学习资源,它覆盖了数据库的存储结构、索引原理、事务处理、锁机制以及Java数据库编程等多个方面,对于希望提升数据库技术水平的开发者来说,是一份宝贵的...
MySQL 是一款广泛使用的开源关系型数据库管理系统,其学习笔记涵盖了多个关键知识点。以下是对这些知识点的详细解释: 1. **MySQL 体系架构** - **网络连接层**:处理客户端的连接请求,包括连接管理、认证和安全...
《MYSQL完全手册学习笔记》是针对MySQL数据库系统的一份详细学习资料,主要涵盖了数据库的各个方面,包括基础概念、安装配置、SQL语法、表的设计、索引、事务处理、视图、存储过程、触发器、备份恢复等。这些知识点...