数据库的并发操作

数据库的并发操作

事务

事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

事务是恢复和并发控制的基本单位

事务ACID特性:

  • 原子性(Atomicity):事务是数据库的逻辑工作单位
  • 一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变

    到另一个一致性状态

  • 隔离性(Isolation):一个事务的执行不能被其他事务干扰
  • 持续性(Durability ):一个事务一旦提交,它对数据库中数据的改变就应该

    是永久性的。

并发控制

事务是并发控制的基本单位

并发控制机制的任务

  • 对并发操作进行正确调度
  • 保证事务的隔离性
  • 保证数据库的一致性

并发操作带来的数据不一致性

  1. 丢失修改(Lost Update)
  2. 不可重复读(Non-repeatable Read)
  3. 幻读(Phantom Read)
  4. 读“脏”数据(Dirty Read)

丢失修改:两个事务T-1和T-2读入同一数据并修改,T-2的提交结果破坏了T-1提交 的结果,导致T-1的修改被丢失。(修改-修改冲突)

不可重复读:事务1读取某一数据,事务2对其做了修改;当事务1再次读该数据 时,得到与前一次不同的值(读-更新冲突)

幻读:事务T-1按一定条件从数据库中读取了某些数据记录,事务T-2删除(插入) 了其中部分记录 ,当T-1再次按相同条件读取数据时,发现某些记录神秘地 消失(出现)了。(读-插入/删除冲突)

脏数据: 事务T-1修改某一数据,并将其写回磁盘;事务T-2读取同一数据后,T-1由 于某种原因被撤销这时T-1,已修改过的数据恢复原值,T-2读到的数据就 与数据库中的数据不一致T-2读到的数据就为“脏”数据,即不正确的数据(修 改-读冲突)

数据不一致性:由于并发操作破坏了事务的隔离性

并发控制就的目的就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性

并发控制的主要技术

  • 封锁(Locking)
  • 时间戳
  • 乐观控制法
  • 多版本并发控制

封锁

封锁:封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发 出请求,对其加锁

封锁是实现并发控制的一个非常重要的技术

基本封锁类型

  • 排它锁(Exclusive Locks,简记为X锁)又叫写锁
  • 共享锁(Share Locks,简记为S锁)又叫读锁

排它锁:若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都 不能再对A加任何类型的锁,直到T释放A上的锁保证其他事务在T释放A上 的锁之前不能再读取和修改A

共享锁:若事务T对数据对象A加上S锁,则事务T可以读A,但不能修改A,其它事务 只能再对A加S锁,而不能加X锁,直到T释放A上的S锁,保证其他事务可 以读A,但在T释放A上的S锁之前,不能对A做任何修改

封锁协议

封锁协议:在运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则为 Locking Protocol

对封锁方式规定不同的规则,就形成了各种不同的封锁协议,在不同的程度上保证并发操作的正确调度。

封锁协议决定了事物的隔离级别。

三级封锁协议

  • 一级封锁协议
  • 二级封锁协议
  • 三级封锁协议

一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。

? 正常结束(COMMIT

? 非正常结束(ROLLBACK

一级封锁协议可防止丢失修改,并保证事务T是可恢复的,它不能保证可重复读和不读“脏”数据。

二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完 后即可释S锁。

二级封锁协议可以防止丢失修改和读“脏”数据
三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到 事务结束才释放。

三级封锁协议可防止丢失修改、读脏数据和不可重复读。

事务的四个隔离级别

mysql中的隔离级别有四种:

封锁的粒度

封锁对象的大小称为封锁粒度(Granularity)

封锁的对象:逻辑单元,物理单元

逻辑单元: 属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等

物理单元:页(数据页或索引页)、物理记录等

封锁粒度与系统的并发度和并发控制的开销密切相关。

封锁的粒度越大,数据库所能够封锁的数据单元就越少,并发度就越小,系统开销也越小;

封锁的粒度越小,并发度较高,但系统开销也就越大

表锁:封锁粒度为表(关系)的锁

行锁:封锁粒度为行(元祖)的锁

悲观锁与乐观锁

(1)悲观锁:顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

(2)乐观锁: 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

(3)悲观锁 和 乐观锁的区别:

  • 乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能
  • 乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方

原文地址:https://www.cnblogs.com/Cpsyche/p/11984998.html

时间: 2024-07-29 23:30:36

数据库的并发操作的相关文章

【转载】数据库大并发操作要考虑死锁和锁的性能问题

本文转载自:http://blog.csdn.net/yuanyuanispeak/article/details/52756167 1 前言 数据库大并发操作要考虑死锁和锁的性能问题.看到网上大多语焉不详(尤其更新锁),所以这里做个简明解释,为下面描述方便,这里用T1代表一个数据库执行请求,T2代表另一个请求,也可以理解为T1为一个线程,T2 为另一个线程.T3,T4以此类推.下面以SQL Server(2005)为例. 2 锁的种类 共享锁(Shared lock). 例1: -------

多线程实现数据库的并发操作

在Java中,程序需要操作数据库,操作数据首要事就是要获得数据库的Connection对象,利用多线程对数据导入数据库中将会加快操作进度,但是多个线程共享Connection对象,是不安全的,因为可以利用Java中的ThreadLocal为每个线程保存一个Connection对象,代码如下: package com.quar.innovation.db; import java.sql.Connection; import java.sql.DriverManager; public class

如何处理大量数据并发操作

文件缓存,数据库缓存,优化sql,数据分流,数据库表的横向和纵向划分,优化代码结构! 锁述的概 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统 脏读 A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致 不可重复读 A用户读取数据,随后B用户读出该数据并修改,此时A用

数据库中的并发操作带来的一系列问题及解决方法

数据库中常见的并发操作所带来的一致性问题包括:丢失的修改.不可重复读.读脏数据.幻影读(幻影读在一些资料中往往与不可重复读归为一类). 丢失修改 下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题. 考虑飞机订票系统中的一个活动序列: 甲售票点(甲事务)读出某航班的机票余额A,设A=16. 乙售票点(乙事务)读出同一航班的机票余额A,也为16. 甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库. 乙售票点也卖出一张机票,修改余额A←A-1.所以A为15,把A写回数

网上资料笔记总结!!数据库事务并发问题,锁机制和对应的4种隔离级别

数据库事务并发问题 数据库的操作通常为写和读,就是所说的CRUD:增加(Create).读取(Read).更新(Update)和删除(Delete).事务就是一件完整要做的事情.事务是恢复和并发控制的基本单位.事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少.事务在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序.是数据库中各种数据项的一个程序执行单元.事务是用户定义的一个操作序列(多个表同时读写).这些操作要么都做,要么都不做,是一个不可分割的工作单位

并发操作的一致性问题

2.2.1 并发一致性问题 常见并发并发一致性问题包括:丢失的修改.不可重复读.读脏数据.幻影读(幻影读在一些资料中往往与不可重复读归为一类). 2.2.1.1 丢失修改 下面我们先来看一个例子,说明并发操作带来的数据的不一致性问题. 考虑飞机订票系统中的一个活动序列: 甲售票点(甲事务)读出某航班的机票余额A,设A=16. 乙售票点(乙事务)读出同一航班的机票余额A,也为16. 甲售票点卖出一张机票,修改余额A←A-1.所以A为15,把A写回数据库. 乙售票点也卖出一张机票,修改余额A←A-1

MYSQL数据库学习----MYSQL数据库、表操作和引擎区别

MYSQL数据库的操作 一:查看MYSQL中所有的数据库 SHOW DATABASES; 二:创建数据库 CRETAE DATABASE 数据库名称; 三:删除数据库 DROP DATABASE 数据库名称; 四:查看数据库支持的存储引擎 SHOW ENGINES; 四:连接MYSQL数据库 USE 数据库名称; MYSQL数据库中表的操作 一:查看数据库中的所有表格 SHOW TABLES: 二:查看表格的结构 DESC 表名称;(基本结构): 或 SHOW CREATE TABLE 表名称;

PHP使用数据库的并发问题

原载于我的博客 http://starlight36.com/post/php-db-concurrency 在并行系统中并发问题永远不可忽视.尽管PHP语言原生没有提供多线程机制,那并不意味着所有的操作都是线程安全的.尤其是在操作诸如订单.支付等业务系统中,更需要注意操作数据库的并发问题. 接下来我通过一个案例分析一下PHP操作数据库时并发问题的处理问题. 首先,我们有这样一张数据表: mysql> select * from counter; +----+-----+ | id | num

简述数据库事务并发机制

摘要: 事务是最小的逻辑执行单元,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态.事务具有四个重要特性,即原子性(Atomicity).一致性(Consistency).隔离性 (Isolation)和持久性 (Durability).本文首先叙述了数据库中事务的本质及其四大特性(ACID)的内涵,然后重点介绍了事务隔离性的动机和内涵,并介绍了数据库为此所提供的事务隔离级别以及这些事务隔离级别能解决的事务并发问题.介于并发安全与并发效率的平衡,我们一般