电商平台高并发思考-数据库锁和事务(2)

大部分电商业务使用的是事务性数据库,我们本文以mysql作为分析对象,数据库引擎为innodb,并结合常用spring框架结合起来分析数据库锁和事务在具体场景下怎样发挥作用。本文从以下几个方面讲述数据库锁和事务。

1、数据库锁定义和类型

首先简要介绍一下什么是锁,目前才多进程多线程执行都会存在并发问题,简单的说就是多个操作按照随意顺序进行进行相关处理,如果不加锁就会出现数据覆盖数据计算错误等问题,因此为了让操作有序进行需要加锁,例如java中lock,sychronized。数据库实现中为了防止并发问题使用了锁,但是对于数据库使用者来说我们关注的是什么情况下数据库会加锁,加了什么锁。

相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。表级锁开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 

(1) MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预

(2) InnoDB实现了以下两种类型的行锁。

共享锁(s):又称读锁。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

排他锁(X):又称写锁。允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁。若事务T对数据对象A加上X锁,事务T可以读A也可以修改A,其他事务不能再对A加任何锁,直到T释放A上的锁。

对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据。 

对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句:update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,加共享锁可以使用select … lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制。

另外innodb引擎还有意向锁参见mysql数据库意向锁意义 - 简书

2、数据库锁和隔离级别

数据库中在并发情况下数据发生异常情况主要分为以下几类:

a、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

b、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

c、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

       说完了数据库异常我们就来说下为了解决这些数据库异常提出四种数据库隔离级别,分别是读未提交(read-uncommitted),不可重复读(read-committed),可重复读(repeatable-read),串行化(serializable)

       每种隔离级别都是通过加锁的方式来保证数据库数据一致性。另外innodb为了提交数据库并发性结合mvcc(多版本快照,加版本号区别)和锁结合方式,读采用多版本不加锁,其他都是加锁防止发生数据异常

3、数据库事务和锁关系

什么是数据库事务简单的说来,事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 

例如:A向B转账100元,对应于如下两条sql语句:

updatefromaccountsetmoney=money+100wherename='b';

updatefromaccountsetmoney=money-100wherename='a';

数据库默认事务是自动提交的,也就是发一条sql它就执行一条,如果想多条sql放在一个事务中执行,则需要使用如下语句:

数据库开启事务命令:

start transaction :开启事务

rollback:回滚事务

commit:提交事务

         下面我们来说一下数据库锁和事务关系,数据库在事务开始时申请数据库锁,例如update操作,但是事务在未提交时候获取的锁不释放,如果该update是锁定表或者制定行则其他操作该表或者改行数据操作就需要等待锁释放,如果其他事务不提交数据则其他等待锁的操作等到直到超时,因此数据库事务操作范围不可过大,导致阻塞其他事务处理数据。

4、电商平台中数据库事务怎么处理并发

电商平台肯定会设计到事务数据库的操作,并且数据库的操作可能还会引起重复操作和并发问题,在使用过程中涉及到多个表操作一定要加事务,另外事务加范围不可太大尽量最小范围,另外利用事务的传播机制来限制事务的是否回滚以及范围,另外需要并发操作的可以考虑cas乐观锁或者条件限制进行并发操作具体一些可以参考:电商平台高并发思考-幂等性(1)

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

推荐阅读更多精彩内容