简单聊聊事物的四大特性,四大特性的实现原理。

事物的四大特性?
    ACID
    1.原子性 atomicity
        一个事物是一个不可分割的工作单位,其中的操作,要么都做,要么不做。不存在中间状态。
    2.一致性 consisitency
        事物执行的前后,数据必须处于一种合法的状态。(可以自己定义 ,保持数据的一致性。)
    3.隔离性 lsolation
        多个事物并发执行的时候,事物内部的操作与其他事物是隔离的,并发执行,互不干扰。
    4.持久性 Durability
        事物一旦提交,对数据库的改变是永久性的。不受任何影响。

四大特性的实现原理?
    1.mysql如何保证一致性的?
        两个层面。
/*        
        1.数据库    通过原子性, 持久性,隔离性,来保证一致性。
                    AID 三大特性,是前提。
        2.应用层面    通过代码判断数据库数据是否有效,然后再决定是回滚还是提交数据。
*/

    2.mysql怎怎么保证原子性的?
    /*
1.利用innodb的undo log。 叫做回滚的日志

        当事务回滚的时候,能够撤销所有已经成功执行的SQL语句,需要记录你要回滚的响应日志
2.举例说明        
        当你update一条数据,需要记录之前的旧值,回滚的时候,根据旧值进行update操作。
            
        undo log 记录了这些回滚需要的信息,当事务执行失败,就可以以利undo log 中的信息
        将数据回滚到修改之前的样子。
    */
        
    3.mysql怎么保持久性的?
    /*
1.        是利用innodb 的 redo log。、

        mysql把磁盘上的数据加载到内存中,在内存中对数据进行修改,在刷回磁盘上。
        此时宕机,内存中的数据就会丢失。
        
2.如何避免宕机?        
        在事物提交之前将数据写入磁盘中。--------【引发的问题。】》只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了
        
        毕竟一个事务里的SQL可能牵涉到多个数据页的修改,而这些数据页可能不是相邻的,
        也就是属于随机IO。显然操作随机IO,速度会比较慢。
        
3.采用redo log?
        做数据修改的时候,不仅在内村中操作,还会在redo  log 中记录这次操作,
        提交事物的时候,会将redo log 日志进行刷盘 redo log 一部分在内存中,一部分在磁盘上。
        数据库宕机重启,就将redo log中的内容恢复到数据库中,再根据undo log 和binlog 内容决定
        回滚还是提交数据。
4.好处?    
        redo log 体积小,只记录了那一页修改了什么,体积小,刷盘快。
        一直往末尾进行追加,属于顺序io.效率比随机io来快。
    */
    
    4.mysql怎么保证隔离性的。
/*
    利用锁 和mvcc 机制。
    
    MVCC,即多版本并发控制(Multi Version Concurrency Control),
    一个行记录数据有多个版本对快照数据,这些快照数据在undo log中。
    
    如果一个事务读取的行正在做DELELE或者UPDATE操作,
    读取操作不会等行上的锁释放,而是读取该行的快照版本。
    
    在事务隔离级别为读已提交(Read Commited)时,一个事务能够读到另一个事务已经提交的数据,
    是不满足隔离性的。但是当事务隔离级别为可重复读(Repeateable Read)中,是满足隔离性的。
*/    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
原文地址:https://www.cnblogs.com/ZXF6/p/11691969.html