Mysql事务中的ACID是怎么实现的

首先明确几个概念:

事务的四大特征,redo log,undo log,mysql锁技术(共享锁/排他锁),MVCC

四大特性(ACID)

1.原子性(Atomicity)

  原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。失败回滚的操作事务,将不能对事务有任何影响

2. 一致性(Consistency)

  一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

  例如:A和B进行转账操作,A有200块钱,B有300块钱;当A转了100块钱给B之后,他们2个人的总额还是500块钱,不会改变。

3. 隔离性(Isolation)

  隔离性是指当多个用户并发访问数据库时,比如同时访问一张表,数据库每一个用户开启的事务,不能被其他事务所做的操作干扰(也就是事务之间的隔离),多个并发事务之间,应当相互隔离。
  例如同时有T1和T2两个并发事务,从T1角度来看,T2要不在T1执行之前就已经结束,要么在T1执行完成后才开始。将多个事务隔离开,每个事务都不能访问到其他事务操作过程中的状态;就好比上锁操作,只有一个事务做完了,另外一个事务才能执行。

4. 持久性(Durability)

  持久性是指事务的操作,一旦提交,对于数据库中数据的改变是永久性的,即使数据库发生故障也不能丢失已提交事务所完成的改变。

redo log

重做日志,是用来实现事务的持久性。重做日志缓冲(redo log buffer)(内存中)以及重做日志文件(redo log)(磁盘中)。当事务提交之后会把所有修改信息都会存到该日志中。

实例:把张三的银行账户中的余额转到他的理财账户中。

sql实现:
start transaction;
select balance from bank where name="zhangsan";
update bank set balance = balance - 400;
update finance set amount = amount + 400;
commit;

redolog的工作流程图

 

 

 

 

 

作用:mysql 为了提升性能不会把每次的修改都实时同步到磁盘,而是会先存到Boffer Pool(缓冲池)里头,把这个当作缓存来用。然后使用后台线程去做缓冲池和磁盘之间的同步。

说简单点就是redolog就是存执行sql的日志,万一数据丢失了,可以从日志里读取,重新执行,保证了事务持久性的特点

undo log

回滚日志,用于记录数据被修改前的信息。他正好跟前面所说的重做日志所记录的相反,重做日志记录数据被修改后的信息。undo log主要记录的是数据的逻辑变化,为了在发生错误时回滚之前的操作,需要将之前的操作都记录下来,然后在发生错误时才可以回滚。

 

 

 

作用:undo log 记录事务修改之前版本的数据信息,因此假如由于系统错误或者rollback操作而回滚的话可以根据undo log的信息来进行回滚到没被修改前的状态。

说简单点就是保存redolog里面的反向sql日志,发生异常回滚的时候执行undo log里面的sql,回滚的事务执行以前,也就是事务回滚的原理,也就是他保证了事务的原子性

Mysql共享锁/排他锁

1、共享锁(shared lock),又叫做"读锁":读锁是可以共享的,或者说多个读请求可以共享一把锁读数据,不会造成阻塞。就是说可以多个人或者多个线程来读,但是不能进行写操作。
2、排他锁(exclusive lock),又叫做"写锁":写锁会排斥其他所有获取锁的请求,一直阻塞,直到写入完成释放锁。就是说只能一个人或者一个线程来操作,可以读也可以写。

总结:通过读写锁,可以做到读读可以并行,但是不能做到写读,写写并行。

MVCC

通过数据多版本来做到读写分离。从而实现不加锁读进而做到读写并行。
MVCC在mysql中的实现依赖的是undo log与read view
  undo log :undo log 中记录某行数据的多个版本的数据。
  read view :用来判断当前版本数据的可见性

说简单点就相当于乐观锁,有了版本号的概念,每行数据都有版本,只能读取到与自己版本相同的数据,要是版本不同就升级版本

 

 

 

 

事务的隔离性是通过 (读写锁+MVCC)来实现的,而事务的一致性,就是上述所说的redolog,undolog,(读写锁+mvcc)共同来实现的。

Mysql事务的具体使用使用和可能出现的问题以及解决原理见我的另一篇文章:使用Mysql事务可能出现的问题以及解决原理

posted @ 2021-01-28 17:14  盛崖余  阅读(182)  评论(0编辑  收藏  举报