2018/12/7 数据库事务和分布式事务

早上占坑,晚上补


 什么是数据库事务,

数据库事务是保证数据原子操作的机制,通过事务可以保证数据操作的成功或失败,避免产生部分成功的情况。

 

实际应用举例:

充值操作的支付成功回调,支付宝回调给处理接口后,一般至少会有两条处理,1.改变订单状态 2.修改账户的余额。

那么如果没有事务,就可能会出现,订单状态修改成功,然后调用修改账户余额时失败的情况,这种情况不加控制就会出现生产事故。尤其是跟钱打交道的事情,都是大事情。

为了保证安全,必须保证两条信息要么都成功,要么都失败,这样才能更方便地进行后续处理,比如失败后重新提交或者人工处理。总之数据不会出现订单和余额不一致的异常的状态。

 

事务的原理:
事务其实并非借助了什么复杂的硬件机制完成的统一成功、统一失败,事务失败回滚,其原理很简单,就是通过书写回滚日志。

在用户调用事务的方式提交多条SQL语句时,在执行SQL语句之前会先将当前的状态信息或执行的SQL命令信息写到回滚日志中,这样,在多条SQL执行过程中如果发生了异常情况或失败,数据库通过回滚日志记录的信息将数据库还原到第一个SQL执行之前的状态,然后通知调用者执行失败。这就是事务的基本原理,核心就是回滚日志和回滚。

 

分布式事务,

分布式事务的目标和普通的事务是相同的,都是为了保证数据的一致性,但是分布式事务的环境更复杂,比如传统的事务处理一般是在一个系统中,某一个接口下,

调用JDBC的接口,声明以事务的方式提交多个SQL命令,然后就可以根据返回的执行成功或者失败进行接下来的处理,但是分布式事务复杂在多个命令是发生在不同的系统中的,

比如上面的例子中使用分布式开发,账户系统和订单系统分别是不同的系统,甚至可能是不同类型的数据库,那么如何保证不同系统的多个操作保持原子性难度就更大了一些。

 

不过,其核心原理仍然相同,但是这时回滚日志和事务协调就不能是交给某个数据库去管理了,因为涉及到多个系统多个数据库,这个记录沟通、协调的功能由一个独立的事务应用来管理,这就是分布式事务框架的由来,,,其实这是我猜的,分布式事务具体还没看

 

程序其实说简单也简单,万变不离其宗,无论是什么复杂分布的事务,都是通过

一个程序扮演协调者的角色,记录各个操作的操作信息,监控各个操作的操作结果,当出现处理失败时将数据还原,核心思想就是这样。

 

高级拓展:

MySQL ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

 

posted @ 2018-12-07 09:11  BaizLi  阅读(428)  评论(0编辑  收藏  举报