- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
OceanBase 1.0 的分布式事务
数据库的功能强大而繁杂,其中,“事务(Transaction )”是使用者不自觉就会用到的功
能。作为开发数据库的工程师,我们是倾注了大量的精力和时间在事务这个功能上,并
且深知数据库系统实现事务是付出了很大代价的。这代价不仅包括数据库软件开发的工
作,而且还包括数据库运行过程中的代价。换句话说,在其他情况不变的时候,如果数
据库放弃事务功能,能获得更好的性能。在数据库软件刚出现时,并没有事务这个功能,
但这种情况下,使用数据库开发软件很多时候无法保证数据的正确性和一致性,或者把
软件搞得很复杂。所以,数据库支持了事务功能,提供给使用者一个将许多数据库的操
作打包在一起的功能,例如 Atomic (原子性),保证事务内对数据的多次修改操作,
要么全部完成要么全部回滚。虽然付出了很多代价,但是用户的应用程序会因此大大简
化。而且,用户操作数据的流程越来越复杂,如果没有事务特性的保证,使用者更加无
法确切知道数据在数据库中是否保持正确。
事务重要的 4 个特性 ACID 分别代表 Atomicity (原子性)、Consistency (一致性)、
Isolation (隔离性)、Durability (持久性)。
Atomicity (原子性)表示事务中的多个操作要么全部完成,要么全部没有生效,
不会出现中间状态;
Consistency (一致性)表示事务操作不会违反数据库的一致性约束;
Isolation (隔离性)表示多个并发事务之间不互相影响;
Durability (持久性)表示事务一旦成功就不会丢失。
数据库系统有很多工程化方法来实现这些事务特性。其中,保证所有数据都存储在持久
化设备中,就可以保证数据的 Durability (持久性)。常用的持久化设备有磁盘和SSD,
这种设备保证在断电的时候数据都不会丢失。事务的一致性是数据库系统对于数据的约
束,常见的约束有数据库的外键(Foreign Key),数据库系统保证事务执行后这些约束
都不会被破环。这两个功能点,在有原子性(Atomicity )和隔离性(Isolation)的基础
上,系统实现起来相对简单。所以,在这篇文章中,我们只详细描述原子性 (Atomicity )
和隔离性(Isolation)两个特性。
原子性(Atomicity )
原子性(Atomicity )是事务中最重要的特性,如果一切操作正常,保证原子性(Atomicity )
并不复杂。保证事务原子性(Atomicity )的复杂性多出自异常处理,例如宕机恢复、主
备切换等。以一个事务修改两行数据为例,如果在修改完第一行之后、修改第二行之前
机器宕机了,如果没有其他机制保证,待机器重新恢复服务,就只有第一行的修改存留
在系统中,违反了原子性(Atomicity )的要求。
什么是原子性(Atomicity )
实现原子性(Atomicity )的一种方法是将多个操作的生效时机放在一个原子操作上。计
算机系统在内存操作上可以做到原子性的操作有给一个内存变量赋值、CAS 操作等。硬
盘的原子性操作和硬件本身有关,磁盘一般是一个 512 字节的块写入是原子的,SSD 一
般是 4KB 的块写入是原子的。用一个数据结构的例子说明这种原子性实现机制。
struct Balance {
int accountA;
int accountB;
};
Balance * x = new Balance();
上面是 C++ 的结构体,表示了两个账户 A 和 B 的余额。如果从 A 转账 5 元给 B,
对应的 C++ 代码如下:
x-accountA -= 5;
x-accountB += 5;
上面的代码不是原子的,在两条语句中间,如果另一个线程读取 accountA 和 accountB
的值,会发现转账操作只执行了一半。如果使用下面的代码,就可以保证无论什么时候
读取,都不会读到转账执行了一半的情况:
Balance * tmp = new Balance();
tmp-accountA = x-accountA - 5;
tmp-ac
原创力文档


文档评论(0)