• Intern Day26


    事务概念

    事务是一个操作集合,这些操作要么都执行,要么都不执行。

    典型的例子:从银行的帐户A转帐到帐户B,需要:1.从帐户A取出款项 2.把款项放入帐户B中。这两个过程要么同时成功,要么同时失败。

    这一系列的操作就是事务性(Transactional)操作。

    事务特性

    又叫:ACID特性。

    1. 原子性:当事务结束,它对所有资源状态的改变都被视为一个操作,这些操作要不同时成功,要不同时失败。理解:主要依靠undo.log日志实现,即在事务失败时执行回滚。undo.log日志会记录事务执行的sql,当事务需要回滚时,通过反向补偿回滚数据库状态。

    2. 一致性:操作完成后,所有数据必须符合业务规则,否则事务必须中止。理解:事务在执行的前和后数据库的状态都是正常的,表现为没有违反数据完整性,参照完整性和用户自定义完整性等等。

    3. 隔离性:事务以相互隔离的方式执行,事务以外的实体无法知道事务过程中的中间状态。理解:多线程时多事务之间互相产生了影响,要避免这个影响,那就加锁。mysql的锁有表锁,行锁,间隙锁,好像还有一个锁数据库的,叫全局锁还是什么来着。写写操作通过加锁实现隔离性,亵渎操作通过MVCC实现。

    4. 持久性:事务提交后,数据必须以一种持久性方式存储起来。理解:主要依靠redo.log日志实现。首先,mysql持久化通过缓存来提高效率,即在select时先查缓存,再查磁盘;在update时先更新缓冲,再更新磁盘。以减少磁盘io次数,提高效率。但由于缓存断电就没了,所以需要redo.log日志。在执行修改操作时,sql会先写入到redo.log日志,再写入缓存中。这样即使断电,也能保证数据不丢失,达到持久性。

    使用代码

    使用事务管理在数据层使用得特别广泛。数据层的事务都是继承自DBTransaction,派生自IDbTransaction。

    IDbConnection Connection {get;}     // 返回Connection对象
    
    void Commit(); // 数据提交,把所有改变数据保存到持久化数据库
    
    void Rollback();  // 数据回滚,把所有数据恢复原值
    // 数据回滚就是没有执行完成遇到错误,返回到之前的正确的状态
    
    transaction = connection.BeginTransaction("SampleTransaction"); //启动事务
    
    //设定SqlCommand的事务和连接对象
    command.Connection = connection;
    command.Transaction = transaction;
    
    transaction.Commit();  // 完成提交
    
    transaction.Rollback(); // 数据回滚
    
    context.SubmitChanges(); // 更新数据
    
    context.Transaction.Commit(); // 事务提交
    
    context.Transaction.Rollback();  // 数据回滚
    
    ……学到后面再写
    

    参考

    https://www.cnblogs.com/leslies2/archive/2012/01/05/2289106.html#t1

  • 相关阅读:
    字符串匹配——KMP算法(C++)
    数论——Fibonacci数列(C++)
    数据结构——线段树之二(C++)
    数据结构——线段树之一(C++)
    最后的最后
    开始的开始
    10.25模拟 保留道路
    10.25模拟 列车调度
    10.25模拟 三角形
    洛谷 P1093 奖学金
  • 原文地址:https://www.cnblogs.com/OFSHK/p/14537104.html
Copyright © 2020-2023  润新知