| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> 解读数据库封锁协议 -> 正文阅读 |
|
[大数据]解读数据库封锁协议 |
数据库都会有一个参数叫最大连接数。上述查询结果是:数据库服务器在理想状态时,是可以承受1000个并发用户来访问的。并发访问就会存在以下问题: 一个数据库里面,对同一个数据进行并发修改操作,造成丢失更新;对同一个数据进行并发有读有写操作,造成不可重复读和读"脏"数据这是不可以接受的。为了解决这个问题,前辈们搞了一个数据库封锁协议。 数据库封锁协议前,先了解读锁和写锁,给写操作弄了一把写锁,叫排它锁,也叫X锁。如果给某个数据加了写锁,其它写锁或读锁就没办法给这个数据加上去了。给读操作弄了一把读锁,叫共享锁,也叫S锁,给一个数据加了读锁,那么其它事务或操作也可以给这个数据加读锁,但是加不了写锁了。 一级封锁协议 解析: 根据一级封锁协议,假设两个并发都是来写的,第一个并发正常加写锁,然后对该数据进行读写操作,并且还没有完成。此时,另外一个并发也来写,在写之前给这个数据进行加写锁,发现这个数据上面有一把锁,此时这个并发只能在那等待,等待到第一个并发读写操作完毕。此时:两个或两个以上的写,串行着来,所以能够解决丢失更新的问题。 根据一级封锁协议,只规定了并发写的操作,并没有规定读操作。如果并发中,有读操作,可以来读加了写锁的数据上,也可以读没有加锁的数据上,此协议下,依然存在不可重复读和读"脏"数据的问题。 二级封锁协议 解析: 我们知道,一级封锁协议解决了并发是写操作的情况,但是没有规定并发中有读操作的行为。所以制定了二级封锁协议。 二级封锁协议是在一级封锁协议基础上,规定了并发是读操作的行为。就是规定并发中是读操作的,那么在读操作之前需要加一个读锁。如果此时这个数据,被一个并发写操作加了一把写锁,根据写锁的特点(排它性),这个数据是无法再加一个写锁或读锁,所以呢就规定了这个并发中的读操作只能等写操作结束后才能去读。这样子这个并发读操作,拿到的是没有写操作时的数据,根据定义,这个数据就不算是"脏"数据。但是呢,根据二级封锁协议,读完就释放读锁,对于这个并发读,有可能还需要去读其它的表,可能有需求再回来再确定刚才读的数据有没有问题后,最终返回给用户结果。在去操作其它表的时候,有可能有并发写操作对这个数据进行修改,然后写操作之后,那个读回来了,发现刚才那个值变了。 所以这个二级封锁协议解决了读"脏"数据的问题,却没有解决数据可重复读的问题。 三级封锁协议 解析: 三级封锁协议解决了二级封锁协议中并发读操作不能进行数据不可重复读的问题。协议中的事务T,说的是办一件事。这件事情有可能会访问好几张数据库表(表A,表B,表C),最终返回结果给请求方,这算一个完成的事务。所以呢,三级封锁协议的释放这个读锁的时间放到了,最终返回结果给请求方的时候。解决了数据不可重复读的问题。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 4:37:14- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |