zoukankan      html  css  js  c++  java
  • 温故知新之 数据库的事务、隔离级别、锁

    首先,为什么需要事务?

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

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

    事务的特性: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

  • 相关阅读:
    转:关于JAVA多线程同步
    转:Java HashMap实现详解
    索引创建规则:
    数据库为什么要分库分表
    [设计模式] javascript 之 桥接模式
    [百度地图] ZMap 与 MultiZMap 封装类说明;
    [设计模式] Javascript 之 外观模式
    [设计模式] javascript 之 代理模式
    [设计模式] javascript 之 装饰者模式
    [设计模式] javascript 之 适配器模式
  • 原文地址:https://www.cnblogs.com/larryzeal/p/6278969.html
Copyright © 2011-2022 走看看