谈谈数据库事务原理,如何设计分布式数据库事务

一、mysql单机事务是如何实现的

关于网上谈及分布式数据库事务的文章并不少,不过大多都是讲市面上存在的解决方案,含有太多特定名词,看了难免一头雾水。今天我们来聊聊分布式事务。首先我们看一看这么个案例。A向B采购一批货物,这里涉及先发货还是先付钱,我们发现他们两个人必须有个先后,而这种先后避免不了会发生纠缠不清。实际解决这类问题的方案就是需要有个第三方来公证。这里我先下两个定义:

1.事务是发生在“写”的基础之上。只有两个或者两个以上的写操作互相间有干预才会发生事务。

2.事务就是第三方公证。

关于事务的四个特性(原子性、一致性、隔离性,持久性)等就是事务要履行的职责。我们来看看mysql解决事务的方式:

1.表A有数据更改(数据库发生“写”操作),建立事务T。

2.事务T记录表A写操作的诉求S1(此诉求记录是持久的,不会因为机器宕机而丢失,即持久性)。

3.只要存在诉求S1,表A就要进行写操作。表A根据诉求S1的要求,进行持久化。(以下是事务的原子性

     ①表A持久化成功,就执行消除诉求S1的操作

     ②表A持久化失败,就执行回滚操作,回滚成功后,就执行消除诉求S1的操作。

那么问题就出现在诉求S1的消除过程,当表A持久化成功后,S1消除操作失败。怎么办?因此,就存在了幂等操作的要求。就是保证,只要存在S1,表A就要执行对应的持久化操作,无论执行多少次结果都一样,即一致性。(幂等操作举例,账户1001有余额100元,扣款5元,无论执行多少次,结果都是100-5=95元,即此诉求记录了原值、修改值)。由于并发的关系,实际上解决幂等操作等方案就是添加锁机制,即事务锁。

以上问题,如果我们回到并发场景,我们就会有疑问,当数据库表发生写操作,又发生了读写操作怎么办?

1.数据库表事务操作是建立在同一行记录的。

2.同一行记录发生了并发问题(建立在两个或者以上的事务),那么取数以什么为标准,就是我们所说的隔离级别,即隔离性,以下是mysql的隔离级别方案:

   ①读未提交(事务1发生了写操作产生诉求S1,表A还没持久化,事务2读取S1的修改值。)

   ②不可重复读(事务1发生了写操作产生诉求S1,表A已经持久化,事务2读取表A中的值。)

   ③可重复读(事务1发生了写操作产生诉求S1,表A已经持久化,事务2读取了S1中的原值。)

   ④串行化(事务1发生了写操作产生诉求S1,表A已经持久化,不允许事务2进行读操作。)

二、总结

参照单机mysql事务来解决分布式数据库事务,主要核心实现就是这个第三方公证的设计,只要遵守事务的四大特性(原子性、一致性、隔离性,持久性),就能实现分布式数据库事务。

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值