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

首先明确几个概念:

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

四大特性(ACID)

1.原子性(Atomicity)

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

2. 一致性(Consistency)

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

  例如: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)(磁盘中)。当事务提交以后会把全部修改信息都会存到该日志中。mvc

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

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(缓冲池)里头,把这个看成缓存来用。而后使用后台线程去作缓冲池和磁盘之间的同步。spa

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

undo log

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

 

 

 

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

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

Mysql共享锁/排他锁

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

总结:经过读写锁,能够作到读读能够并行,可是不能作到写读,写写并行。

MVCC

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

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

 

 

 

 

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

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

相关文章
相关标签/搜索