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

对snapshot isolation和write-snapshot isolation的一些思考

数据库中存在读异常写异常

所谓snapshot,目的在于保证事务执行的各个阶段,读相同的数据项得到的结果没有变化,这样一来就避免了不可重复读、幻读等读数据异常。

但是仅仅是读数据不变还不够,因为这样只是解决了读异常,却不能解决写异常,而对于写异常,可以从脏写丢失更新写偏序三种进行讨论。对于这些写异常,snapshot isolation通过避免WW冲突进行解决(无法解决写偏序),write-snapshot isolation通过避免RW冲突进行解决,但二者的共同点都是从根本上彻底消除了某一种冲突的存在。(对于这三种写异常的定义,参考了《数据库事务处理的艺术》P8和P10)

-      对于脏写,我认为依靠多版本机制就可以解决,在回滚时只要将本事务写入的版本删去即可,不影响其它事务写入的版本。

-      对于丢失更新,需要同时出现RW冲突和WW冲突,只要避免二者中任意一个即可解决,因此snapshot isolation和write-snapshot isolation都可以解决这个问题。

-      对于写偏序一定会出现RW冲突,却不一定会出现WW冲突,因此snapshot isolation不能解决该异常,而write-snapshot isolation却可以解决。

由此不难看出,write-snapshot isolation是要比snapshot isolation更加严格的。但是,我认为write-snapshot isolation的并发度不一定比snapshot isolation更高,这一点可以从一下例子看出:

 

T1

T2

t0

R(A1)

 

t1

 

W(A2)

t2

W(B1)

 

t3

 

Commit

t4

Commit(失败)

 

 

t0时刻,T1读取了数据项A,紧接着在t1时刻,T2对数据项A进行了更新。因此在t4时刻,T1检查读集会失败,导致T1事务回滚。而在snapshot isolation中,T1和T2事务都可以正常提交。

但这同样不能说明snapshot isolation的并发度要比write-snapshot isolation差,还要根据具体场景(读密集、写密集)再做判断。但是由此至少可以看出,write-snapshot isolation还有很大的优化空间。

转载于:https://www.cnblogs.com/slontia/p/11387891.html

相关文章:

  • 深入详解JVM内存模型
  • NOIP 模拟29 B 侥幸
  • Linux——安装并配置Kafka
  • NOIP模拟30B 活该
  • Deepin 触摸板
  • Linux——配置maven
  • 获取固定经纬度固定范围的经纬度值
  • ssh通过pem文件登陆服务器
  • 使用NGINX+LUA实现WAF功能 和nginx 防盗链
  • c++计算1到100以内的质数
  • nice -n 10 bash 和 chrt 10 bash 和 echo -17 /proc/PID/oom_score_adj
  • Docker容器跨主机通信--overlay网络
  • 从内核3.7版本开始,Linux就开始支持VXLAN 到了内核3.12版本,Linux对VXLAN的支持已经完备,支持单播和组播,IPv4和IPv6。...
  • Failed to get D-Bus connection: Operation not permitted
  • Linux——查询服务器公网IP
  • AWS实战 - 利用IAM对S3做访问控制
  • C# 免费离线人脸识别 2.0 Demo
  • canvas实际项目操作,包含:线条,圆形,扇形,图片绘制,图片圆角遮罩,矩形,弧形文字...
  • CSS魔法堂:Absolute Positioning就这个样
  • EOS是什么
  • ES2017异步函数现已正式可用
  • jquery ajax学习笔记
  • PermissionScope Swift4 兼容问题
  • Promise初体验
  • Rancher-k8s加速安装文档
  • React+TypeScript入门
  • Zepto.js源码学习之二
  • 翻译:Hystrix - How To Use
  • 跨域
  • 1.Ext JS 建立web开发工程
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #、%和$符号在OGNL表达式中经常出现
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $(document).ready(function(){}), $().ready(function(){})和$(function(){})三者区别
  • (003)SlickEdit Unity的补全
  • (1)(1.9) MSP (version 4.2)
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (二)丶RabbitMQ的六大核心
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • .bat批处理(十):从路径字符串中截取盘符、文件名、后缀名等信息
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net 设置默认首页
  • .Net 知识杂记
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • .net程序集学习心得
  • .NET轻量级ORM组件Dapper葵花宝典
  • .NET设计模式(2):单件模式(Singleton Pattern)
  • .Net中间语言BeforeFieldInit
  • .net中应用SQL缓存(实例使用)
  • @Autowired @Resource @Qualifier的区别
  • @Responsebody与@RequestBody
  • [ C++ ] STL---string类的使用指南