封锁机制以及读锁和写锁的区别

原创 2016年08月02日 17:10:25

我们在开发中也许都有感受到,数据库的并发操作会带来许多问题,比如丢失更新、不可重复读、读脏数据(幽灵数据)等等,常见的比如自动售票系统,站点1、2同时读出剩余的票数n张,站点1售出一张票,并将n-1写入数据库,站点2也售出一张票并将n-1写入数据库,但是我们都知道,应剩余n-2张票,这就是典型的丢失数据更新的实例。为避免该类问题的产生,我们采用了封锁机制,简单点就是当一个线程要对数据库进行相关操作时,先给数据库加上适当的锁,以此来避免其他线程对数据库进行操作而带来的干扰。
并发操作之所以产生错误,是因为不同线程并发执行事务互相干扰造成的。所以我们要对事务的并发操作进行控制,即并发控制。一般DBMS进行并发控制的方法是封锁机制和事务机制。
封锁就是对数据表、数据行等操作之前,先向系统请求对其加锁,说通俗点就是操作之前先声明权限。
封锁的周期(环节):申请加锁、获得锁权限、释放锁权限
最基本的封锁类型有两种:排它锁(Exclusive Locks,X锁)和共享锁(Share Locks,S锁)。

  • 排它锁也称独占锁、写锁或X锁,若sessionA获得某数据表的排他锁权限,那么sessionA只能对该表进行读取或修改,其他session既不能读取也不能修改该表,更不能对该表加任何类型的锁,直到sessionA释放排它锁权限。加锁方式:lock tables tablename write;操作如下:
    sessionA:
    这里写图片描述
    sessionB:
    这里写图片描述
    从上图操作可以看出sessionA获得ha表排它锁权限以后sessionB执行访问ha表操作以后并没用显示ha数据而是在等待sessionA释放锁权限。

  • 共享锁也称读锁或S锁,若sessionA获得某数据表的共享锁权限,那么任何session(包括sessionA)只能对该表进行读取,不能修改该表,sessionA可以继续对该数据表加X锁,其他session可以对该数据表继续加S锁但不能加X锁,直到sessionA释放共享锁权限。加锁方式:set tables tablename read;操作如下:
    sessionA:
    这里写图片描述
    sessionB:
    这里写图片描述
    从上图操作可以看出,sessionA获得ha表共享锁权限以后,sessionA和sessionB都可以访问ha表,但是当sessionA想更改ha表时直接报错(ERROR 1099 (HY000): Table ‘ha’ was locked with a READ lock and can’t be updated ha表有一个共享锁不能被修改),sessionB更改ha表时并没有显示修改成功,而是在等待sessionA释放共享锁权限。

  • 注意,在sessionA同时获得某数据表的S和X锁权限时,sessionA只能select该数据表,其他session将不能对该表进行任何操作,包括select、update、drop、delete、lock等等,直到sessionA释放相关锁权限。

版权声明:本文为博主原创文章,未经博主允许不得转载。

MySQL中的读锁和写锁

在数据库的锁机制中介绍过,数据的锁主要用来保证数据的一致性的,数据库的锁从锁定的粒度上可以分为表级锁、行级锁和页级锁。在我的博客中重点介绍过MySQL数据库的行级锁。这篇文章主要来介绍一下MySQL数...

互斥锁、读写锁 、 自旋锁和RCU锁

基础知识思考整理http://blog.csdn.net/aganlengzi/article/details/50996227 互斥锁 mutex:在访问共享资源之前对进行加锁操作,在访问完成之后进...

多线程的那点儿事(之读写锁)

【 声明:版权所有,欢迎转载,请勿用于商业用途。  联系信箱:feixiaoxing @163.com】     在编写多线程的时候,有一种情况是十分常见的。那就是,有些公共数据修改的机会比...

java 中 ReentrantReadWriteLock的读锁和写锁的使用

jdk文档中关于ReentrantReadWriteLock类使用的一个很好的例子,以下是具体的介绍:    在使用某些种类的 Collection 时,可以使用 ReentrantReadWri...

读写锁的基本理解及简单用法

一、需要材料: 1.pthreads-w32-2-8-0-release.exe 下载:ftp://sourceware.org/pub/pthreads-win32 二、操作步骤: 1.VS20...

线程同步互斥锁和读写锁的区别

读写锁特点: 1)多个读者可以同时进行读 2)写者必须互斥(只允许一个写者写,也不能读者写者同时进行) 3)写者优先于读者(一旦有写者,则后续读者必须等待,唤醒时优先考虑写者)   互斥锁特...

聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁)

读写锁是数据库中很常见的锁,又叫共享-排他锁,S锁和X锁。读写锁在大量读少量写的情况下有很高的效率优势。 读写锁是基于普通的互斥锁构建出来的更复杂的锁,它有两个基本特点: 1. 当任一线程持有读锁...

封锁

封锁 ...
  • narci
  • narci
  • 2006年09月27日 14:11
  • 1406

mysql 数据表读锁机制详解

为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。 一、概述 MySQL有三种锁的级别:页级、表级、行级。 MyISAM和MEMORY存储引擎采用的是表...

聊聊高并发(十五)实现一个简单的读-写锁(共享-排他锁)

读写锁是数据库中很常见的锁,又叫共享-排他锁,S锁和X锁。读写锁在大量读少量写的情况下有很高的效率优势。 读写锁是基于普通的互斥锁构建出来的更复杂的锁,它有两个基本特点: 1. 当任一线程持有读锁...
  • ITer_ZC
  • ITer_ZC
  • 2014年11月03日 11:47
  • 5151
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:封锁机制以及读锁和写锁的区别
举报原因:
原因补充:

(最多只允许输入30个字)