数据库锁机制

乐观锁和悲观锁

悲观锁:就是假设每次操作数据时都会认为会产生冲突,所以每次操作都都会通过获取锁来进行操作数据
乐观锁:乐观锁认为一般情况下数据不会造成冲突,所以在数据进行提交更新时才会对数据的冲突与否进行检测。其特点就是先进行业务操作,不到最后式不会去拿锁的,乐观的认为拿锁多半是成功的。

共享锁和排他锁

共享锁和排他锁都是悲观锁的实现。其中共享锁又称为读锁,其他用户可以并发读取数据,但任何事物都不能对其数据进行修改,是在读取的时候创建的语法为:

start transaction;
select * from table where id =1  lock in share mode;
commit;

排他锁又称为写锁:加了排他锁,只能对其对这个事务进行读写,在此结束前,其他事务不能对其加任何锁,其他进程可以读取,不能写操作,语法为:

begin/ begin work/ start transaction;
select * from table where id =1 for update;
commit; 

乐观锁的实现

乐观锁在数据库上的实现完全式逻辑的 数据库本身并不支持需要自己开发。
实现办法:

版本号控制原理:
1.为表加一个version字段
2.当读取数据时,连同这个version字段一起读出来
3.数据每更新一次就给该值加1
4.当提交更新时,判断数据库表中对应的记录的当前版本号是否与之前取出来的版本号一致,如果一致则可以直接更新。如果不一致则表示表示过期数据需要重试

版本号机制
一般是在数据表中加上版本号字段 version,表示数据被修改的次数。当数据被修改时,这个字段值会加1。

举个简单的例子:假设帐户信息表中有一个 version 字段,当前值为 1 ,而当前帐户的余额( balance )为 100 。

操作员 A 此时准备将其读出( version=1 ),并从其帐户余额中扣除 50( 100-50 );
操作员 A 操作的过程中,操作员 B 也读入此用户信息( version=1 ),并从其帐户余额中扣除 20 ( 100-20 );
操作员 A 完成修改工作,将数据版本号加1( version=2 ),连同帐户扣除后余额( balance=50 ),提交到数据库完成更新;
操作员 B 完成了操作,也将版本号加1( version=2 )试图向数据库提交数据( balance=80 ),但此时比对数据库记录版本发现,操作员 B 提交的数据版本号为 2 ,数据库记录的当前版本也为 2 ,不满足 “提交版本必须大于记录当前版本才能执行更新“ 的乐观锁策略。
因此,操作员 B 的提交被驳回。这样,就避免了操作员 B 用基于 version=1 的旧数据修改,最终造成覆盖操作员 A 操作结果的可能。

CAS

行锁和表锁

行锁和表锁也是属于悲观锁的一种试按照锁的对象来划分的

行锁的特点:锁的粒度小,发生锁冲突的概率低、处理并发的能力强;开销大、加锁慢、会出现死锁
加锁的方式:自动加锁。对于UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁;对于普通SELECT语句,InnoDB不会加任何锁。
表级锁特点:开销小、加锁快、无死锁;锁粒度大,发生锁冲突的概率高,高并发下性能低
加锁的方式:自动加锁。查询操作(SELECT),会自动给涉及的所有表加读锁,更新操作(UPDATE、DELETE、INSERT),会自动给涉及的表加写锁。 
脏读:当一个事务执行过程中修改了某个数据,这时,另一个事务读到这个数据叫做脏读,因为如果第一个事务进行回滚的话,那么数据本身没有改变,其他事务读到的是错误的数据。

虚读:当事务读取某个数据后,另一个数据对该数据进行了修改,而第一个事务再次读取该数据就会发现两次读取结果不一致。

幻读:一个事务读取几行数据后,另一个事务插入了几行数据,则第一个事务再次读取时就会发现多了几行数据,和虚读的区别在于,虚读是针对一个数据的重复读不一致问题,幻读是对一组数据重复读的不一致。虚读的重点是修改,幻读的重点在于新增或者删除。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 转自:https://blog.csdn.net/Hudonyo/article/details/81101326...
    ilovebugs阅读 341评论 0 1
  • 【为什么要锁】 数据库是一个多用户使用的共享资源,比如一个用户表t_user,两个浏览器前面的人登录了同个一个账号...
    简单点t阅读 258评论 0 1
  • 脏读、不可重复读和幻读都是数据库读一致性问题,需要由数据库提供一定的事务隔离机制来解决。 (1)锁机制 解决写-写...
    Java耕耘者阅读 1,467评论 0 1
  • 数据库是一个多用户共享的资源,这样的话对于多个用户在存取同一数据的时候,就会出现问题,举个最经典的问题----票务...
    三两五花肉阅读 195评论 0 0
  • 敬爱的老师,智慧的班主任,亲爱的跃友们:大家好!我是来自山峰教外教育的韩英雪,今天是我的日精进行动第214天(7....
    金八力韩英雪阅读 116评论 0 0