关于mysql:mysql事务的实现原理

31次阅读

共计 1182 个字符,预计需要花费 3 分钟才能阅读完成。

1. 什么是事务?

数据库事务 (transaction) 是拜访并可能操作各种数据项的一个数据库操作序列,这些操作要么全副执行, 要么全副不执行,是一个不可分割的工作单位。事务由事务开始与事务完结之间执行的全副数据库操作组成

2. 事务的四大个性(ACID)
2.1 Atomicity 原子性
原子性是指事务是一个不可分割的单位,要么都产生,要么都不产生
  • 2.1.1 回滚日志

    想要保障事务的原子性,就须要在异样产生时,对曾经执行的操作进行回滚,而在 MySQL 中,复原机制是通过回滚日志(undo log)实现的,所有事务进行的批改都会先记录到这个回滚日志中,而后在对数据库中的对应行进行写入。
    回滚日志除了可能在产生谬误或者用户执行 ROLLBACK 时提供回滚相干的信息,它还可能在整个零碎产生解体、数据库过程间接被杀死后,当用户再次启动数据库过程时,还可能立即通过查问回滚日志将之前未实现的事务进行回滚,这也就须要回滚日志必须先于数据长久化到磁盘上,是咱们须要先写日志后写数据库的次要起因。
    回滚日志并不能将数据库物理的复原到执行语句或事务之前的样子,他是逻辑日志。

2.2 Consistency 一致性
一致性是指利用从一个正确的状态到另外一个正确的状态。ACID 就是通过 AID 来保障 C 的。如何了解正确的状态呢?正确的状态就是咱们须要约定的一些束缚,比方张三账户有 90 元,如果他买货色须要破费 100 元,则买完当前账户余额就是 -10 元,那么 -10 元是不是一个正确的状态呢?答案是的。这是因为咱们并没有约定账户字段不能为负。
2.3 Isolation 隔离性

多个事务并行处理时,互相应该没有影响
隔离级别:
1. 读未提交
2. 读已提交
3. 可反复读(innodb)
4. 串行化

脏读:读到其余事务未提交的更新数据,
幻读:一个事务,读取两次,失去的记录条数不统一
不可反复读:反复读取后数据不统一

  • 2.3.1 隔离级别的实现

    其实也是多线程问题。所以应用并发管制机制,限度不同事务对同一资源的读写。这里介绍三种最重要的并发控制器机制的工作原理。
    1. 锁

mysql 提供两种锁,共享锁和互斥锁,也叫读锁和写锁

2. 工夫戳
应用工夫戳的话,就是乐观锁的实现形式,写入数据的时候先对数据进行批改,再判断工夫戳是否变动过,如果没有,就更新,变了的话,就生成新的工夫戳再次更新数据

3. 多版本和快照隔离
通过保护多个版本的数据,数据库能够容许事务在数据被其余事务更新 时,去读取旧版本的数据。
2.4 Duration 持久性
持久性是指一旦事务被提交,他对数据库中数据的扭转就是永久性的。
3. 事务的状态:

Active:事务的初始状态,示意事务正在执行;
Partially Commited:在最初一条语句执行之后;
Failed:发现事务无奈失常执行之后;
Aborted:事务被回滚并且数据库复原到了事务进行之前的状态之后;
Commited:胜利执行整个事务;

正文完
 0