zoukankan      html  css  js  c++  java
  • 数据库原理20/6/23笔记

    事务是数据库操作序列,这些操作要么全做,要么全不做

    简单说就是all or none

    既然是一个整体,那么最终会有两种结果

    COMMIT 事务正常结束 即 对数据库的更新永久生效

    另一种ROLLBACK 事务异常终止

    事务回退到开始时的状态

    事务的特征有

    原子性
    一致性
    隔离性
    持续性

    1. 原子性就是上边说的all or none
    2. 一致性是数据库中只包含成功事务提交的结果或者叫 一致性状态,反之则称为 不一致状态,即 数据库中包含失败事务的结果,
    3. 隔离性是一个事务的执行不能被并发执行的其他事务干扰
    4. 持续性也称永久性是指一个事务一旦提交,它对数据库中数据的改变就应该是永 久性的,永久的具体含义,不受断电影响,没电了,数据库更改依然有效

    下边看事务并发,并发的概念,操作系统学过

    并发就是宏观上并行,微观上不并行;或者叫微观上交替

    多核出现以后,并行变得很普遍

    微观上的同时执行,好在并发控制和并行控制,方法的基本原理一致

    所以除了个别细节,并发、并行的基本处理思路大致相同


    并发操作会带来不一致性

    操作系统里专门引进了P、V操作

    P操作实质上是 封锁,V操作实质上是 解锁

    数据库的并发控制比操作系统考虑得更细致

    还有一个区别在于可以reset,数据库上边说了叫 持续性

    数据写进磁盘长期有效,reset不管用就是说数据库是管理数据的

    还必须考虑,最终结果,数据的一致性

    所以数据库的并发控制做得更深入一些

    把 并发操作带来的数据不一致性分成三种情况

    1 丢失修改

    2 不可重复读

    3 读“脏”数据

    1:

    898b046431ebc0e0aaab845ed4fa914

    3:

    91b946f2598481191edc2513f254446

    2:

    238a243b48b67d9197e3d5d38f5b481

    数据库做得细致一些,对于数据操作

    读和写按照不同的方法进行处理

    对 锁分成了两种类型   读锁和写锁

    读锁 又叫 共享锁

    读锁 又叫 共享锁简记为S锁(share锁)

    写锁 又叫 排它锁,简记为X锁

    X是 排它英文单词eX......

    现在看一下两种锁的区别:

    数据加了 排它锁,其它事务就不能再给数据加 任何锁

    而 共享锁 是一个事务加给数据了 S锁,其它事务还可以再加 S锁

    5467aa9f03c75e20a6d0cf917f75480

    这个图显示了所有情况,S锁和S锁 相容

    S锁和S锁 相容,S锁和X锁 不相容,X锁和X锁也 不相容


    用锁的方法称为 封锁协议

    有三种封锁协议、递进关系

    一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放

    从叙述来看,一级封锁协议针对 数据修改一级封锁协议针对 数据修改,也就是 写操作

    它的作用是解决 丢失修改 问题

    2889671ac55a4a2ceb88b20f9438460

    二级封锁协议:一级封锁协议+事务T在读取数据R前必须先加S锁,读完后即可 释放S锁

    以前,读脏数据的原因是对 读 没有加任何限制。现在,读 之前需要加S锁

    但是,根据锁的相容性,数据上有X锁,导致S锁加不上去,也就读不成,直到另一个事务撤销,

    三级封锁协议:一级封锁协议+事务T在读取数据R之前必须先对其加S锁,直到 事务结束才释放

    区别在:S锁,直到 事务结束才释放vsS锁,读完后即可 释放S锁,即 S锁的释放时间不同

    显然三级封锁协议 更严格,相应的它能解决的问题就更多

    三级封锁协议 可以解决 防止丢失修改+不读脏数据+可重复读

    93748522f69d8ab85a3fc4dddc1b0a0

    原来 不可以重复读,是因为 没有S锁,或者 读完后立即释放S锁,给中间其它事务修改数据留下了空隙

    现在S锁,直到 事务结束才释放,根据锁的相容性

    数据上有S锁,X锁加不上去,因而也无法被修改

    从而保证两次读取结果一致

    总结:

    de5d2f1ba644283d2ae2017ccb7ba03

    另一角度

    并行是否正确取决于结果是否等于 串行

    并发结果=串行结果得到的协议叫两段锁协议

    随便用
  • 相关阅读:
    坦克大战
    java多线程应用场景
    java中的多线程(资料)
    设置线程名
    线程名称的设置及取得
    java调试
    文件上传细节处理
    Servlet生命周期
    java的动态绑定与静态绑定
    Mysql 连接池调用完成后close代理方法引出的设计模式
  • 原文地址:https://www.cnblogs.com/pqhuang/p/13183575.html
Copyright © 2011-2022 走看看