当前位置: 首页 > news >正文

数据库并发操作

事物的特性

1,原子性--事物中包含的所有操作要么全做,要么全部做(由恢复机制实现)

2,一致性--事物的隔离执行必须保证数据库的一致性,事物开始前,数据库保持一致性,
事物结束后仍保持一致性,(由用户来负责,由并发机制实现)、
3,隔离性--系统必须保证事物不受其他并发执行事物的影响,对任意一对事物T1,T2
要么T1在T2执行结束之前执行,要么在T1完成之后开始执行,(通过并发控制机制实
现)
4,持续性--一个事物一旦提交之后,他对数据库的影响必须是永久的
系统发生故障不能改变事物的持久性(恢复机制实现)


事物的操作组成
1,事物开始
begin transaction 事物开始
2,事务读写操作
read/write transaction 事物进行数据操作
3,事物提交
commit transaction 事务完成所有数据操作,同时保存操作结果,它标志着事物成功完成
4,事务回滚
rollback transcaction事物未完成所有数据操作,重新返回事务开始状态,标志着事物的撤销

 

并发操作与数据的一致性
并发操作带来数据不一致的三种情况
1,丢失修改
2,读过时数据
3,读脏数据

排它锁,共享锁
如果事务T对数据对象Y加上了排它锁,那么T即可以读取Y也可以更新Y
如果事务T对数据对象Y加上了共享锁,那么T可以读取Y,但不能更新Y

一次加锁锁住的数据大小被称为锁的颗粒
如果单元小,则该锁是 细粒度
如果单元大,则该锁是 粗粒度


封锁协议 --是对数据对象加锁,持锁和释放锁时约定的一些规则,不同的锁规则形成了不同的封 锁协议
1级封锁协议
规定事务T在事务更新数据对象之前,必须对该数据对象加排他锁,并且直到事务T结束时 才可以释放该锁

利用一级封锁协议可以防止丢失更新问题的发生

2级封锁协议
规定事务T在更新数据对象之前,必须对数据加X锁,且直到事务T结束时才可以释放该 锁,还规定事务T在读取数据对象之前必须先对其加S锁,读完后释放S锁

防止丢失更新问题,还可以防止未提交以来问题,但却不能防止不一致性分析问题

3级封锁协议
规定事务T在更新数据对象前,必须对数据对象加X锁,且直到事务T结束才可以释放该锁 ,还规定事务T在读取数据对象之前必须先对其加S锁,该S锁也必须在事务T结束才可 以释放

三级封锁协议可以防止丢失更新和未提交依赖问题,还可以防止不一致性分析问题的发生 ,但却带来了其他问题,死锁和活锁

死锁和活锁
在多个事务并发执行的过程中,可能会存在某个尽管总有机会获得锁的事务却永远也没有得到锁,这种情况称为活锁
多个并发事务处于等待的状态,其中的每一个事务都在等待他们中的另一个事物释放封锁
这样才可以继续执行下去,但任何一个事物都没有释放自己已获得的锁,也无法获得其他事物已拥有的锁,所以只好相互等待下去

封锁的预防
1,每个事物必须一次性将所有使用的数据加锁,或者必须按照一个预先约定的加锁顺序对使用到的数据加锁
2,每当处于等待状态的事务有可能导致死锁时,就不在等待下去,强行事务回滚

死锁恢复
当系统中存在死锁时,一定要解除死锁,具体的方法时从发生死锁的事务中选择一个回滚代价最小的事务,将其彻底回滚,或者回滚到可以解除死锁处,使他的事务可以获得想应的锁,而得以继续运行下去

事务Ti运行时,有唯一的时间标记,称为时戳,用Ts(Ti)表示,时标技术的基本思想是
1,每个事物开始执行时,系统为这个事物赋予一个时标,一般为当前时间,称之为启动时间,用TS(Ti)标识
2,每个事物所进行的每个读写操作,均具有时标属性
3,系统标识并保存每个有数据项Q的最近读时标R_TM(Q)和写时标W_TM(Q)


封锁机制
封锁类型
1,共享锁,非独占的,允许多个并发事务读取其锁定的资源,数据被读取后,立即释放共享锁,如:select
2,修改锁,
3,独占锁,
4,意向锁

 

 

 

 

相关文章:

  • 列出目录下所有文件
  • Java 程序编译运行
  • Go语言并发之美
  • 我的PGA我作主----搞清楚什么是真正的PGA
  • PostgreSQL在何处处理 sql查询之十一
  • heartbeat 3.0集群(1)集群原理
  • 【乡巴佬】在Word中合理排列文本框与文本
  • c#类的初始化顺序
  • VIM使用系列:位置跳转和块模式
  • js字符串
  • oracle列表分区的ADD VALUES和DROP VALUES语句
  • python setattr,delattr()
  • 流程图控件FlowChart.NET组件的使用(二)
  • 企业架构研究总结(23)——TOGAF架构开发方法(ADM)之技术架构阶段
  • 图片闪烁效果
  • 【笔记】你不知道的JS读书笔记——Promise
  • Hibernate【inverse和cascade属性】知识要点
  • JAVA_NIO系列——Channel和Buffer详解
  • Java的Interrupt与线程中断
  • Laravel Mix运行时关于es2015报错解决方案
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • vue2.0一起在懵逼的海洋里越陷越深(四)
  • Vue实战(四)登录/注册页的实现
  • 基于OpenResty的Lua Web框架lor0.0.2预览版发布
  • 前端技术周刊 2019-02-11 Serverless
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 7行Python代码的人脸识别
  • ​水经微图Web1.5.0版即将上线
  • #define,static,const,三种常量的区别
  • #if #elif #endif
  • #微信小程序(布局、渲染层基础知识)
  • $.ajax()方法详解
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (附源码)php新闻发布平台 毕业设计 141646
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (四)模仿学习-完成后台管理页面查询
  • (算法)求1到1亿间的质数或素数
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET/C# 编译期能确定的字符串会在字符串暂存池中不会被 GC 垃圾回收掉
  • /etc/shadow字段详解
  • @ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)
  • @EnableWebMvc介绍和使用详细demo
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [1181]linux两台服务器之间传输文件和文件夹
  • [2018-01-08] Python强化周的第一天
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [CodeForces-759D]Bacterial Melee
  • [Erlang 0129] Erlang 杂记 VI 2014年10月28日
  • [GN] 后端接口已经写好 初次布局前端需要的操作(例)