Mysql事务的实现原理

mysql5.7之后默认的数据引擎为 InnoDB,InnoDB支持行级锁,是Mysql数据库的最小操作。若想实现事务控制,数据库引擎必须为InnoDB!

事务是什么?

现实中的事务一般指我们要做的一件事,例如:去菜市场买菜;这样的‘一件事’可以拆分为:去菜市,找要买的菜,付钱等...
而在代码中可以理解为:查询商品,支付,生成订单。。。。。

事务可以理解为由一个或多个事件组成的一系列操作*
如:

//修改用户名
public String update(id,name) {
        //select * from user where id=id;
        user.setName(name);
        //updet user set name = user.getName() where id=id
    }

一个方法中执行了两个数据库操作,这称之为一个事务;

事务有四个特性:原子性,一致性,隔离性,持久性;
洋气一点叫:ACID
那么这四个特性的意思是:

  • 原子性Atomicity) : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;(简单理解:要么生,要么死;不存在半死不活的)
  • 一致性Consistency): 执行事务前后,数据保持一致;(简单理解:你保存的是1,那就不能是2)
  • 隔离性Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;(简单理解:你吃的饭,不会被我抢去)
  • 持久性Durability): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。(简单理解:保存了,除非把电脑砸了,不然是不会丢失的)

事务是如何实现的?

具体说是Mysql InnoDB是如何实现事务的 原子性,一致性,隔离性,持久性?

分三步:

  1. InnoDB使用 重做日志(redo log),保证持久性, 回滚日志(undo log),保证原子性;
  2. InnoDB通锁机制 + MVCC(多版本事务控制技术)等;保证隔离性;
  3. 前三者得到保证后,一致性才有了保障