在说两阶段提交之前,大家要了解undo-log、redo-log、binlog。
先了解它们,才能更好的理解什么是两阶段提交
二、事务及它的特性#
==========
在说两阶段提交事物之前,我们先来说说事务。
一般当我们的功能函数中有批量的增删改时,我们会添加一个事物包裹这一系列的操作,要么这一组操作全部执行成功,只要有一条SQL执行失败了我们就全部回滚。相信你一定听说过这个比较经典的转账的Case。有一定工作经验的同学都知道,这么做其实是保护我们的数据库中不出现脏数据。整体数据会变得可控。
对MySQL来说你可以通过下面的命令显示的开启、提交、回滚事务
Copy# 开启事务
begin;
或者下面这条命令
start transaction;
提交
commit;
回滚
rollback;
但是日常开发中大家普遍使用编程语言操作数据库。比如Java、Golang… 在使用这种具体编程语言持久层的框架时,它们一般都支持事务操作,比如:在Spring中你可以对一个方法添加注解@Transctional显示的开启事务。Golang的beego中也提供了让你可以显示的开启事务的函数。
有一点不太好的地方是:大家在享受这种编程框架带来的便利的同时,它也屏蔽了你对MySQL事务认知。让人们懒得去往细了看事务
你可以看看我下面这个很简单的Case。
我有一张