Mysql事务、底层实现原理
https://www.jianshu.com/p/081a3e208e32
1) mysql的事务怎么写:事务提交与回滚
mysql> start transaction;#手动开启事务 mysql> insert into t_user(name) values('pp'); mysql> commit;#commit之后即可改变底层数据库数据 mysql> select * from t_user; +----+------+ | id | name | +----+------+ | 1 | jay | | 2 | man | | 3 | pp | +----+------+ 3 rows in set (0.00 sec) mysql> start transaction; mysql> insert into t_user(name) values('yy'); mysql> rollback; mysql> select * from t_user; +----+------+ | id | name | +----+------+ | 1 | jay | | 2 | man | | 3 | pp | +----+------+ 3 rows in set (0.00 sec)
2)事务的实现原理
- redolog与undolog
- redolog:重做日志,实现事务持久性
- mysql真实数据会先存到缓冲池中,再由后台线程将数据同步到磁盘
- redolog可以在数据同步失败的时候恢复数据
-
undolog:回滚日志,用于记录数据被修改前的信息,实现事务的原子性
-
-
-
update的操作会先将当前数据加入undolog中,然后使用行中的隐藏字段DB_ROLL_PTR回滚字段指向前一个版本的数据
-
-
- MVCC实现:通过在每行记录的后面保存两个隐藏的列来实现的
- 这两个列, 一个保存了行的创建时间,一个保存了行的过期时间, 当然存储的并不是实际的时间值,而是系统版本号。
-
- undo log :undo log 中记录某行数据的多个版本的数据。
-
read view :用来判断当前版本数据的可见性
-
MVCC的实现,是通过保存数据在某个时间点的快照来实现的。也就是说,不管需要执行多长时间,每个事务看到的数据是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的。不同存储引擎的MVCC实现是不同的,典型的有乐观(optimistic)并发控制和悲观(pessimistic)并发控制。
- redolog:重做日志,实现事务持久性