OceanBase如何保证写的原子性
分布式数据库技术具体难在哪里呢?简单说,要想账头一分钱都不错,数据库要支持事务,事务拥有ACID原则,这四个字母分别代表:A原子性、C一致性、I隔离性、D持久性。
原子性:表示事务中的多个操作要么全部完成,要么全部失败,不会出现中间状态,例如A转给B100块钱,A账户扣除100块的同时,B账户必须增加100块钱。这两件事必须像一个原子一样紧紧抱在一起,决不允许“A已经扣钱,B还没加钱”的事情发生。
一致性:A转给B100块钱,转账完成的一瞬间,A瞬间再查询自己的最新余额,必须显示已经扣除100之后的金额,B必须瞬间查到已经加上100块之后的余额。所有的账目在任何一个时间切面必须完完全全对得上。
隔离性:表示多个并发事务之间不互相影响,A转给B100块钱,不能对C有任何影响。
持久性:表示事务一旦成功就不会丢失,A转给B100块钱,这笔转账一旦完成,就永远生效。
其中一致性是目的,原子性隔离性和持久化是手段,只要做好ACID中的AID,C自然就能满足。
由于数据散落在多台数据库服务器上,库作了拆分。分布式写最大的难度其实就在于保证ACID中的那个A——原子性。
举个例子,假设A给B转100块钱,由于是“分布式数据库”,A用户的账户数据存在A机器上,B用户的账户数据存在B机器上。
如果交易发生时,负责给A账户扣100块钱的A机器死机,没有扣成功,而负责给账户B加100块钱的B机器工作正常,加上了100——这就会造成支付宝损失100块。
反之,如果负责给A账户扣100块钱的A机器正常,已经扣掉100,而负责给账户B加100块钱的B机器死机,100块没加上,那么用户就会损失100——最后支付宝还要赔偿用户100块。
为了保证以上这两种尴尬的局面不发生,OceanBase 1.0 采用了整整一组技术,但最主要的是两个。