数据库事务的四大特性及四个隔离级别

四大特性

如果一个数据库支持事务的操作,那么该数据库需要具备ACID四大特性:

1.原子性——Atomicity

原子性指事务里的所有操作要么一起成功,要么一起失败回滚。

2.一致性——Consistency

数据在事务执行前后,从一个一致性状态转变至另一个一致性状态。

举例说明,A和B之间转账,A有2000元,B有3000元,无论A和B之间怎样转账,他们的金额之和一定为5000,这就是一致性。

3.隔离性——Isolation

当多个事务并发访问数据库时,各个事务之间应该是隔离的,独立的。一个事务不应该影响其他事务的效果。事务查看数据更新时,数据要么是其他事务执行前的状态,要么是其他事务执行后的状态,不能看到中间的状态。

完全的隔离性只有事务串行执行,那样则不存在并发,效率很低,因此在开发中应结合业务需求设置事务的隔离级别,隔离级别越高,效率越低,反之,效率越高。四个隔离级别稍后介绍。

4.持久性——Durability

持久性,很好理解,就是说事务一旦提交,对数据库造成的影响是永久性的,即便数据库遭遇断网断电等故障,也不会丢失提交的更新。

SQL SERVER通过write-ahead transaction log来确保事务提交后的持久性。事务在提交后,对数据库所做的改变首先会按顺序记录在事务日志中,然后才会写入数据库,当数据库遇到故障重启后,首先会按顺序检查日志中该执行但未执行的更改,并依次执行,保证了持久性。


隔离级别

接下来介绍事务的四个隔离级别:

首先上结论,隔离级别从低到高,性能从高到低:

未提交读,引起脏读;

提交读,解决脏读,引起不可重复读;

可重复读,解决脏读、不可重复读,引起幻读;

串行读,解决脏读、不可重复读、幻读,数据保证了安全,但是失去并发性,效率低。

1.未提交读——Read Uncommitted

事务A修改了数据后,无论该事务A有没有提交,其他任何事务都可以读取到事务A修改后的数据。

潜在问题:当事务A修改数据后提交之前,其他事务读取到A修改后的数据,并在该数据基础上进行操作。此时事务A提交失败数据回滚,数据则出现错误。称其他事务读取到A事务修改但未提交的数据为“脏读”。

锁机制:select句指定 with (nolock),即读数据时不加共享锁,允许其他事务更改数据,则可能读到其他事务未提交的数据。

2.提交读——Read Committed

事务A修改了数据,只有A提交之后,其他事务才可以看到A修改后的数据。解决了“脏读”。

潜在问题:事务B读取了数据后,事务A对该数据进行了修改并提交,此时事务B再次以相同条件读取数据,发现前后两次读取的数据不一致,这就是所谓的“不可重复读”。

锁机制:读取数据时正常加共享锁即可,读完释放,无论事务有没有提交。因为共享锁和排他锁互斥,所以只可能读到排他锁被释放(即提交/回滚后)后的数据。

3.可重复读——Repeatable Read

当使用可重复读隔离级别时,在事务执行期间会锁定该事务以任何方式引用的所有行。因此,如果在同一个事务中发出同一个SELECT语句两次或更多次,那么产生的结果数据集总是相同的。因此,使用可重复读隔离级别的事务可以多次检索同一行集,并对它们执行任意操作,直到提交或回滚操作终止该事务。。解决了“脏读”、“不可重复读”。

潜在问题:幻读,当一个事务对数据的修改涉及到“全部数据行”时,比如修改表里所有行的column1字段为‘string1’,同时,另一个事务以新增的方式向表里插入了一条新的数据(可重复读不允许其他事务修改已存在的数据,因为可重复读只在事务结束时才释放锁。但是对于新插入的数据没办法加锁啊,新插入的数据由执行插入sql的事务持有X锁。)。那么之后,操作第一个事务的用户就会发现明明自己修改了全部行的数据,为什么还有一行数据没有被修改,就好像发生了幻觉一样,这就是幻读。

锁机制:对事务A扫描范围内的数据加U锁或S锁,并一直持有直到事务结束。因此其他事务不可以修改数据,但是可以读取数据。但是可以通过插入新数据的方式改变事务A的结果集。

4.串行读——Serializable

串行读,很容易理解,就是各个事务之间完全隔离,串行执行。

存在问题:已经不是潜在问题了,问题很明显,串行执行,那么并发效率就很低。

锁机制:加Range lock,范围锁可以覆盖到所查询出的行的索引的键值范围,而任何其他事务对范围内数据的修改、添加和删除都需要修改索引,所以此时将会被阻塞,因为范围锁覆盖了索引条目。深入了解Range Lock

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

推荐阅读更多精彩内容