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是如何实现事务的 原子性,一致性,隔离性,持久性?
分三步:
- InnoDB使用
重做日志(redo log)
,保证持久性,回滚日志(undo log)
,保证原子性; - InnoDB通
锁机制 + MVCC(多版本事务控制技术)
等;保证隔离性; - 前三者得到保证后,一致性才有了保障