浅谈事务(一) (r5笔记第24天)

关于事务,在Oracle中似乎是习以为常的,但是在学习MySQL的过程中,发现各种灵活的存储引擎,一个很大的焦点就是对于事务的支持,足以看出事务的实现还是有一定难度的,自己在学习数据库理论和Oracle的时候,对于事务的特性也都是一笔带过,ACID似乎就是书本中的概念和术语,感觉太偏向理论了,但是今天在学习看书中,也借鉴了不少宝贵的经验,重新审视来发现事务的强大和重要性。 好多书中都会提到的ACID,先来看看是怎么说的。 原子性:Atomicity,一致性:Consistency,隔离性:Isolation,持久性:Durability 举个例子来说明,比如使用银行卡转账,给某个朋友转账100块,就需要执行几个步骤: 首先会查看银行卡中的余额是否满足条件。 其次会从银行卡中转出100块, 然后对方的银行卡中会转入100块。 这个例子很简单也很明显, 首先原子性,就是这个转账的过程中,转账操作是一个不可再分的单元了,转账的的操作,卡1转出成功,卡2转入成功,整个过程要不全部完成,要不直接回退。 其次是一致性,就是在数据库中,事务总是从一个一致性的状态转换为另外一个一致性的状态,比如我们在操作的第2步,银行卡转出100块的瞬间,系统奔溃,电脑死机,你的账户也不会平白无故少100块钱。因为事务最终没有提交,所做的修改也不会保存在数据库中。 再次是隔离性,这个一般来说,一个事务所做的修改,对其它事务是不可见的,这一点解释起来稍微有些困难,先放一放。 最后一点是持久性,就是在数据库中,所做的事务变更最后都保存在数据库中,这一点还是从逻辑上保证的。至少在Oracle中你做了commit不会立刻写入数据文件,也是一个异步的过程。 ACID确实可以保证银行卡里不会弄丢钱,但是在逻辑层面要实现这个事务还是很困难的,从MySQL的存储引擎的发展就能看出,InnoDB存储引擎相比MyISAM来说,对于资源的消耗和性能会有一定的打折,但是相比来说就更加有优势。 其中一个难点就是隔离性,在SQL标准里面也提供了4种隔离级别,每一种级别规定了在一个事务的修改过程中,哪些在事务间是可见的,哪些是不可见的。 比如我们用sql语句来表示两个并发的事务。

事务1中开始查看余额,有1000块,然后向卡里转入100块。在这个过程中事务1还是没有提交,是否对于事务2可见这个1100块新余额。

如果从生活实际来考虑是不应该的。如果对于事务2可见,则这种情况下隔离级别就是未提交读(READ COMMITED),就是我们常说的脏读,当然这种隔离级别的开销是很低的,但是会导致很多问题,所以一般的在实际应用还是比较少的。 然后我们进一步思考,如果事务1在充值100块之后,在事务没有提交之前,对于事务2是完全不可见的,这种隔离级别就是不可重复读,或者提交读(READ COMMITED),Oracle中就是采用这种隔离级别的。但是在MySQL中缺默认不是这种隔离级别。 我们来看看第三种隔离级别,可重复读(REPEATABLE READ),这个级别保证了在同一个事务中多次读取同样的记录的结果是一致的。

这种情况,事务1先充值100块,这样余额就是1100,事务2充值100块,余额就是1200,但是在事务1未提交,所以再次查询的时候还是显示余额1100,这种情况就是幻读(Phantom Read)。 最后一种是最高级别,即可串行化(SERIALIZABLE),这种情况下会强制事务串行执行,可以避免幻读的问题,但是他会在读取的每一行数据上都加锁,所以可能导致大量的性能问题。这种情况下使用的场景也很少。 在Oracle中可以使用set transaction isolation level 来指定四种隔离级别。 比如未提交读,就可以运行 > set transaction isolation level read committed; Transaction set.

原文发布于微信公众号 - 杨建荣的学习笔记(jianrong-notes)

原文发表时间:2015-05-02

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Android 研究

反插件化:你的应用不是一个插件(转)

Android插件化技术是应用程序级别的一项创新型技术,它的初衷主要是用于热更新,减少APK安装包的大小,以及解决65535方法数量的限制。从技术层面来说,An...

50020
来自专栏小巫技术博客

Android混淆代码错误堆栈还原

14150
来自专栏Android开发指南

Android 6.0权限

36170
来自专栏CaiRui

nginx的worker_processes优化

nginx的worker_processes参数 来源: http://bbs.linuxtone.org/thread-1062-1-1.html 分享一: ...

75370
来自专栏小狼的世界

Gearman的使用

对于分布式网络环境或者有大量任务的应用,我们需要将任务在不同的服务器之间进行分布,这个时候正好是Gearman发挥实力的时候。虽然我们也可以使用MQ队列再加一些...

13040
来自专栏友弟技术工作室

Nginx简介--nginx系列之一什么是HTTP服务器?什么是NginxNginx 特点

什么是HTTP服务器? HTTP服务器的基本功能就是提供Web信息浏览服务。它只需支持HTTP协议、HTML文档格式及URL。与客户端的网络浏览器配合。因为We...

43780
来自专栏沃趣科技

事务已提交另外会话查询不到的问题解析

导 读 今天遇到一个很有趣的问题:跑python代码程序,使用python程序开启两个session连接数据库,先在第一个session里面对t表查询,然后到第...

33570
来自专栏数据和云

Oracle 12.2新特性掌上手册 - 第三卷 Sharding 的增强

编辑手记:Sharding技术我们谈了好久,想必大家并不陌生,该功能12.2最新版本中,也将变得越来越完善,今天我们一起来学习。 注:文章内容来自官方文档翻译。...

28630
来自专栏腾讯云数据库(TencentDB)

CynosDB for PostgreSQL 架构浅析

作者介绍:林锦,腾讯云数据库团队高级工程师,曾任云计算初创公司系统架构师,从事分布式系统研发7年,2017年加入腾讯云,从事NewSQL研发工作,目前主要负责C...

3.4K210
来自专栏上善若水

s001android逆向安全初级篇之apk逆向常用工具及简单使用一览

关于apk 逆向中的一些工具的使用,看了不少文章,也使用过有很长一段时间了,今天对此做一总结:

35730

扫码关注云+社区

领取腾讯云代金券