• 温故知新之 数据库的事务、隔离级别、锁


    首先,为什么需要事务?

    最典型的例子是银行转账,因为不是原子性的操作(一个账号扣款,另一个账号收款),所以存在出现问题的可能,如这边扣款完毕,然后程序挂掉,收款方又没收到,这钱就蒸发了。

    为了保证流程按照我们预计的执行,所以出现了事务的概念。

    事务的特性:ACID。

    原子性、一致性、隔离性、持久性。

    注意,这是在一个事务操作中表现出来的特性,由技术手段来完成,而不是数据库真的有这些特性。

    • 原子性,我的理解就是 可以将扣款和收款(或者更多操作)看作一个整体操作,如转账这个抽象操作概念,从而表现出原子性 -- 只有成功和失败。
    • 一致性,我的理解就是 原子性的结果 -- 无论成功与否,转账前后两个账号的总额不变。
    • 隔离性,是指与其他事务的关系,保证其他事务只能查询到本事务提交或者回滚之后的数据。
    • 持久性,这个查到有两个意思:①提交后永久保存; ②保存记录,可恢复。个人倾向于第一个。

    隔离级别是什么?

    理论上,事务之间只要先后有序(一个事务执行完再执行另一个,也叫串行化,Serializable),就不会发生数据问题。

    但是,这样显然不合适,因为先后有序会导致事务的阻塞,高并发访问时会导致很长时间没有响应。

    为了解决这个问题,又出现了事务的隔离级别的概念。一般有四个级别,见下表。

    隔离级别

    脏读

    丢失更新

    不可重复读

    幻读

    未提交读:Read Uncommited

    已提交读:Read commited

    可重复读:Repeatable Read

    可串行读:Serializable

    表来自:http://blog.csdn.net/shuaihj/article/details/14163713

    锁又是什么?

    锁是底层的控制机制,事务通过锁来控制隔离级别。

    锁有很多,大致划分为两类:悲观锁、乐观锁。更多请自行搜索。

    • 所谓悲观锁,就是认为一个事务操作的数据也会被其他事务操作。
    • 乐观锁相反,认为一个事务操作的数据不会被其他事务操作。

    实际开发中很少直接操作锁,更多的是利用数据库提供的事务的四个隔离级别。

    可以认为隔离级别是锁的一个整体打包解决方案(引用了参考链接中的原话)。

    参考:

    http://blog.csdn.net/bjyfb/article/details/44022995

  • 相关阅读:
    The executable was signed with invalid entitlements
    iOS7 文本转语音 AVSpeechSynthesizer
    The document "ViewController.xib" could not be opened. Could not read archive.
    UIPanGestureRecognizer
    UINavigationController
    IE6下面的css调试工具
    15款最好的网站音乐播放器
    ASP.NET常用加密解密方法
    ASP.NET根据IP获取省市地址
    强悍的CSS工具组合:Blueprint, Sass, Compass
  • 原文地址:https://www.cnblogs.com/larryzeal/p/6278969.html
Copyright © 2020-2023  润新知