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)并发控制。

 

posted @ 2020-09-04 11:49  king断雨  阅读(1547)  评论(0编辑  收藏  举报