事务实现原理-回滚原理 undo log

其他文章 MVCC Mysql中的MVCC_纯粹的码农的博客-CSDN博客_mysql的mvcc

1. 每个事务都有个事务id

 2. 最终落到 每一个块的原子性。 

     写一个块,部分写完部分未写完。如何判断是否全写完,如何回滚 如何重写,如何幂等重写?

和mysql的事务比较起来:

1. 对page的写是加锁串行的.  (这样lsn大小判断幂等法才有意义)

2. 回滚操作是要实现的.回滚后才能执行下一个对page的改动.

     每次操作有事务id,放在块最后。重写的时候发现有就不重写。没有,部分写了怎么办?double write。如果大事务回滚,只不过改成原来的操作逆写。对块来说另外一种写。省磁盘,只double write,不备份之前的。

正常思考逻辑.

  

    1. 写undo log

    2. 对字段更新

    3. 如回滚,利用undo回滚

    4. 如提交,不做任何操作.

问题: 回滚到一半宕机了怎么办?

我的理解是

    1. update了就加锁了,  加锁以后就可以串行了, 可以大小判断幂等法进行幂等重试.

    其他点: 查看源代码,是否在rollback的时候修改了事务的持久化信息.

事务一旦到达终态.(commit 或者roll back完毕)就,可以从持久化中删除.

考虑性能问题后的改造以及引发的一致性问题解决--:

解决性能问题,引入redo日志

    不时时刷新. 为了保持持久性,引入redo, 这样就引入了脏页的刷新. 和多次刷新问题. 引入lsn进行幂等刷新.

参考文档:

[1] MySQL数据库InnoDB存储引擎Log漫游 http://www.zhdba.com/mysqlops/2012/04/06/innodb-log1/ --回过头再看 老码农 老师的mvcc

[2]  MySQL · 引擎特性 · InnoDB 事务子系统介绍 . 和"老码农mysql mvcc" 都说到一点 PostgreSQL 回滚性能更好.

引文"

当由于各种原因(例如死锁,或者显式ROLLBACK)需要将事务回滚时,会调用handler接口ha_rollback_low,进而调用InnoDB函数trx_rollback_for_mysql来回滚事务。回滚的方式是提取undo日志,做逆向操作。

由于InnoDB的undo是单独写在表空间中的,本质上和普通的数据页是一样的。如果在事务回滚时,undo页已经被从内存淘汰,回滚操作(特别是大事务变更回滚)就可能伴随大量的磁盘IO。因此InnoDB的回滚效率非常低。有的数据库管理系统,例如PostgreSQL,通过在数据页上冗余数据产生版本链的方式来实现多版本,因此回滚起来非常方便,只需要设置标记即可,但额外带来的问题就是无效数据清理开销。

"

[3]  老码农 mysql mvcc 引文:"Rollback则稍微复杂点,需要根据当前回滚指针从undo log中找出事务修改前的版本,并恢复。如果事务影响的行非常多,回滚则可能会变的效率不高,根据经验值没事务行数在1000~10000之间,Innodb效率还是非常高的。很显然,Innodb是一个COMMIT效率比Rollback高的存储引擎。据说,Postgress的实现恰好与此相反。"

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事务实现原理是通过ACID(原子性、一致性、隔离性和持久性)特性来保证数据的一致性和可靠性。 具体实现原理如下: 1. 原子性(Atomicity):事务是一个原子操作单元,要么全部执行成功,要么全部失败回滚MySQL通过日志(Redo LogUndo Log)来实现原子性。在事务执行期间,将所有的修改操作都写入Redo Log中,如果发生了错误或者回滚操作,可以根据Redo Log中的记录重新执行或者回滚事务。 2. 一致性(Consistency):事务执行前后,数据库从一个一致的状态转换到另一个一致的状态。MySQL通过在事务开始前和结束后进行锁定和解锁操作来实现一致性。在事务开始前,会对相关的数据进行锁定,防止其他事务的修改操作;在事务结束后,会释放这些锁。 3. 隔离性(Isolation):多个事务并发执行时,每个事务都应该感觉不到其他事务的存在。MySQL通过锁机制来实现隔离性。在并发执行的情况下,对于读操作(如SELECT),可以使用共享锁(Shared Lock)来允许多个事务同时读取同一份数据;对于写操作(如UPDATE、DELETE、INSERT),需要使用排他锁(Exclusive Lock)来防止其他事务的读写操作。 4. 持久性(Durability):一旦事务提交成功,其结果就应该永久保存在数据库中。MySQL通过将事务操作记录写入磁盘的方式来实现持久性。当事务提交后,会将Redo Log中的修改操作应用到磁盘上的数据文件中,确保数据的持久保存。 综上所述,MySQL通过日志记录、锁机制和数据持久化等方式来实现事务的原子性、一致性、隔离性和持久性。这些机制保证了数据库的数据操作的可靠性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值