关于事务的隔离级别和处理机制的理解

     前几日有一个猎头公司的面试,其中问道我事务隔离这块的知识点,猛一问真是想不起来啊,顿感羞愧啊,回来专门总结一下这方面的知识来夯实一下之前的知识体系,也提醒广大园友们进步在于总结啊,好多不用的知识点,有时候有必要温故知新啊。

简介

      ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性.

     我们通过SQL SERVER对数据库进行管理,不可避免要实现多个进程访问数据库同一数据,或者修改同一数据。 这样就不得不提到SQL Server利用加锁和阻塞来保证事务之间不同等级的隔离性,从而实现事务的互不干扰的访问和操作数据库。

     首先我们要知道都有哪些干扰会影响数据的隔离性:

     1、更新丢失(lost update):当系统允许两个事务同时更新同一数据是,发生更新丢失。

     2、脏读(dirty read):当一个事务读取另一个事务尚未提交的修改时,产生脏读。

      举例说明什么是脏读:

通过以上三个图不难发现,当事务1去插入一条数据,然后图二去读取被插入数据的表,此时事务1还没有commit结果查询结果直接将内存中的脏数据读取出来,再Read Uncommitted 这个级别下,会出现脏读,一旦数据未提交或者未提交成功则读取数据是脏读错误数据。

     3、非重复读(nonrepeatableread):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生非重复读。

      举例说明:

以上三图可以清楚表示出,在一个事务中,两个查询对同一个表,而再事务两次查询中发生了一次数据更新,导致事务中两次查询的结果不同。这就是所谓的nonrepeatableread。

     4、幻像(phantom read):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。

在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:

◆未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

◆授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

◆可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

◆序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

最后附上设置隔离级别的语法(老是记不清楚):

SET TRANSACTION ISOLATION LEVEL {

READ UNCOMMITTED

| READ COMMITTED

| REPEATABLE READ

| SERIALIZABLE

}

总结

     通过全篇的讲述,我们也能清晰的理顺一条思路,隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏bboysoul

网站信息收集工具RED_HAWK

安装使用很简单,首先安装上php,然后git clone下来用php运行就好了 git clone https://github.com/Tuhinshubh...

14020
来自专栏Youngxj

PHP获取用户访问真实IP地址 - Emlog程序IP黑名单插件

24150
来自专栏Java编程技术

实战Spring事务传播性与隔离性

事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务一块...

14620
来自专栏PingCAP的专栏

使用 Ansible 安装部署 TiDB

多机部署 TiDB 太繁琐?快来尝试我们的 TiDB 一键安装吧。本文介绍基于 Ansible Playbook 实现 TiDB 和监控组件的自动化安装和配置,...

1.5K00
来自专栏区块链

腾讯云乐固加固FAQ

注册腾讯云账号成功后找到账号信息,选择绑定QQ或者微信,以后使用PC工具和登录官网时就可以三方快速登录了。

1.8K20
来自专栏向治洪

android混淆和反编译

混淆 Android Studio: 只需在build.gradle(Module:app)中的buildTypes中增加release的编译选项即可,...

28880
来自专栏Kiba518

SqlServer注意事项总结,高级程序员必背!

想成为一个高级程序员,数据库的使用是必须要会的。而数据库的使用纯熟程度,也侧面反映了一个开发的水平。

9530
来自专栏木可大大

脏读、不可重复读和幻读现象

对于软件开发人员来说,有时候我们需要面对瞬时海量的并发请求,例如阿里双十一等活动,当处理并发流程时需要我们通过各种机制保持数据一致性,其中,最有效的一种机制就是...

30120
来自专栏软件开发

HTML5 学习总结(五)——WebSocket与消息推送

B/S结构的软件项目中有时客户端需要实时的获得服务器消息,但默认HTTP协议只支持请求响应模式,这样做可以简化Web服务器,减少服务器的负担,加快响应速度,因为...

45480
来自专栏运维一切

ceph mon自行shutdown故障记录 原

主要在这个“reached critical levels of available space on local monitor storage”,如果mon...

11210

扫码关注云+社区

领取腾讯云代金券