1、数据库事务

1.1 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。

1.2 事务的4个特性(ACID):
(1)原子性(atomic)(atomicity)事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。原子性消除了系统处理操作子集的可能性。
(2)一致性(consistent)(consistency)事务在完成时,必须使所有的数据都保持一致状态。事务结束时,所有的内部数据结构(如B树索引或双向链表)都必须是正确的。
(3)隔离性(insulation)(isolation)由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状 态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据, 并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的隔离级别。在此级别上,从一组可并行执行的事务获得的 结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。防止数据丢失。
(4)持久性(Duration)(durability)事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

1.3 事务有3种模型: 
(1)隐式事务是指每一条数据操作语句都自动地成为一个事务;每个事务都没有显式的开始和结束标记。
(2)显式事务是指有显式的开始结束标记的事务;或者开始是隐式的,事务的结束有明确的标记。(begin transaction 事务开始--commit 事务正常结束--rollback事务出错回滚)
(3)自动事务是系统自动默认的,开始和结束不用标记。

2、并发控制

2.1 常见并发并发一致性问题包括:丢失的修改(lost update)、读脏数据(dirty read)、不可重复读(unrepeatable read)、幻影读(phantom read,又叫幻读,幻象读,非一致性读,或者幽灵数据,往往与不可重复读归为一类)。

2.2 为了解决并发不一致问题,SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。
(1)ReadUncommitted(读取未提交内容)在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读。
(2)ReadCommitted(读取提交内容)这是大多数数据库系统的默认隔离级别(比如SQLSever,Oracle,但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别也支持所谓的不可重复读,因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。
(3)RepeatableRead(可重读)这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致幻读。
(4)Serializable(可串行化)这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。

  脏读 Dirty Read 不可重复读 Non-Repeatable Read 错误读取/幻读/虚读 Phantom Read
读未提交 Read Uncommitted
读已提交 Read Committed ×
可重复读 Repeatable Read × ×
可串行化 Serializable × × ×

2.3 为了体现隔离级别,数据库使用了封锁技术(locking)

(1)S锁,Share Locks,共享锁,读锁,被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加s锁。
(2)X锁,Exclusive Locks,排他锁,写锁,被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象。

2.4 引入封锁技术又带来了“死锁”问题

解决死锁的两类方法:
(1)预防法:一次封锁法(每个事务必须将所用到的数据全部加锁,否则不能执行)和顺序封锁法(对用到的数据按照预先设定的顺序加锁)。
(2)诊断解除法:超时法(一事务超过规定时间则判定发生死锁)和等待图法(事务等待图是一个有向图G=(T,U),T为结点的集合,每个结点表示正在运行的事务;U为边的集合,每条边表示事务等待的情况。若事务T1等待事务T2,则T1,T2之间有一条有向边,从 T1 指向 T2。如果发现图中存在回路,则表示系统中出现了死锁)。

2.5 封锁协议(Locking Protocol)

2.5.1 保证数据一致性的封锁协议的三级封锁协议

对并发操作的不正确调度可能会带来的三种数据不一致性:丢失修改、不可重复读和读“脏”数据。三级封锁协议分别在不同程度上解决了这一问题。
(1)1级封锁协议:事务T修改数据R之前必须先对其X加锁,直到事务结束才释放。事务结束包括正常结束和非正常结束。1级封锁协议可防止丢失修改,并保证事务T是可恢复的。在1级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,所以它不能保证可重复读和不读“脏”数据。
(2)2级封锁协议:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。2级封锁协议除防止丢失修改,还可进一步防止读“脏”数据。在2级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证保重复读。
(3)3级封锁协议:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结果才释放。3级封锁协议除防止丢失修改不读“脏”数据外,还进一步防止了不可重复读

2.5.2 保证并行调度可串行性的封锁协议的两段锁协议

可串行性是并行调度正确性的唯一准则,两段锁(简称2PL)协议是为保证并行调度可串行性而提供的封锁协议。
两段锁协议规定:
在对任何数据进行读、写操作之前,事务道首先要获得对该数据的封锁,而且在释放一个封锁之生,事务不再获得任何其他封锁。
所谓“两段”锁的含义是,事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段,第二阶段是释放封锁,也称为收缩阶段。

2.6 可串行化

调度是一个或多个事务的重要操作按时间排序的一个序列。
如果一个调度的动作首先是一个事务的所有动作,然后是另一个事务的所有动作,以此类推,而没有动作的混合,那么我们说这一调度是串行的。
事务的正确性原则告诉我们,每个串行调度都将保持数据库状态的一致性。 通常,不管数据库初态怎样,一个调度对数据库状态的影响都和某个串行调度相同,我们就说这个调度是可串行化的。[如果一并行调度的结果等价于某一串行调度的结果,那么这个并行调度成为可串行化的]

数据库管理(事务、ACID、并发、封锁、可串行化、隔离)相关推荐

  1. 精通Java事务编程(8)-可串行化隔离级别之可串行化的快照隔离

    本系列文章描述了DB并发控制的黯淡: 2PL虽保证了串行化,但性能和扩展不好 性能良好的弱隔离级别,但易出现各种竞争条件(丢失更新,写倾斜,幻读 串行化的隔离级别和高性能就是相互矛盾的吗?也许不是,一 ...

  2. 并发事务正确性的准则 可串行化_从0到1理解数据库事务(上):并发问题与隔离级别...

    最近准备写一篇关于Spanner事务的分享,所以先分享一些基础知识,涉及ACID.隔离级别.MVCC.锁,由于太长,只好拆分成上下两篇: 上:并发问题与隔离级别 主要讲事务所要解决的问题.思路,先理解 ...

  3. MySQL事务的可串行化

    可串行化--SERIALIZABLE 事务的最高级别,在每个读的数据行上,加上锁,使之不可能相互冲突,因此,会导致大量的超时现象 设置b账户,事务的隔离级别 B账户,首先,将b账户的隔离级别设置为SE ...

  4. 隔离级别(未提交读、提交读、可重复读、可串行化)、多版本并发控制、Next-Key Locks(Record Locks、Gap Locks)

    1. 隔离级别 1.1 未提交读(READ UNCOMMITTED) 事务中的修改,即使没有提交,对其它事务也是可见的. 1.2 提交读(READ COMMITTED) 一个事务只能读取已经提交的事务 ...

  5. php 串行化数据,php中对象的串行化

    我们大家有知道PHP串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据.文章这里就PHP串行化为大家详细的介绍.你在 ...

  6. 并发执行变成串行_大神浅谈数据库并发控制 锁和 MVCC

    在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制.  如果数据库中的所有事务 ...

  7. Mysql学习笔记之事务详解(读未提交、读以提交、可重复读、串行化读)

    文章目录 1.事务概述 2.事务特性 3.事务隔离级别 4.演示事务 4.1.演示读未提交 4.2.演示读已提交 4.3.演示可重复读 4.4.演示串行化读 1.事务概述 什么是事务? 一个事务是一个 ...

  8. 打造千万级流量秒杀第十六课 漏斗模型:如何将并发流量过滤和串行化?

    在前几讲中,我提到了秒杀单机并发能力需要达到 10 万 QPS 以上.你有没有想过:这 10 万请求是否都需要读写 Redis ?秒杀系统又是如何判断哪些请求应该读写 Redis? 我之所以提这个问题 ...

  9. 事务的隔离级别(未提交读、提交读、可重复读、可串行化)

    SQL有四种隔离级别,分别为未提交读(read uncommited).提交读(read commited).可重复读(repeatable read).可串行化(serializable). 一.未 ...

  10. 并发执行变成串行_大白话Java并发面试问题之Java 8如何优化CAS性能?

    专注于Java领域优质技术,欢迎关注 来自:石杉的架构笔记 一.前言 这篇文章给大家聊一下java并发包下的CAS相关的原子操作,以及Java 8如何改进和优化CAS操作的性能. 因为Atomic系列 ...

最新文章

  1. WPF中的容器控件——Grid
  2. 网络营销外包浅析B站破圈运营是如何增强网络营销能力的?
  3. python字符串与文本处理技巧(1):分割、首尾匹配、模式搜索、匹配替换
  4. AE开发中关于 “无法嵌入互操作类型.........请改用适用的接口”问题的解决方法...
  5. 这6个动作,据说只有20%的人能做到!| 今日最佳
  6. Median(POJ-3579)
  7. xss攻击-跨站脚本漏洞修复 Springboot项目
  8. php的floorval函数,php 取整函数(floor,ceil,round,intval)_PHP教程
  9. ssh X11 Forwarding(本地共享远程服务器界面)
  10. idea 设置内存_IntelliJ IDEA修改内存使得变得流畅
  11. 2次拒领诺贝尔奖,爱迪生嫉妒他才华,被美国政府列为绝密人物
  12. 《朗读者》读后感作文3100字
  13. 学网络必备50个知识点
  14. 数据分析驱动数字化企业转型
  15. win10系统下载中文版 64位32位 官方版​
  16. Java后端社招面试个人总结
  17. python3.7的IDEL怎么清屏
  18. 从头开始敲代码之《从BaseApplication/Activity开始(五)》(自定义控件,实现点击/滑动翻页)
  19. 用python画竹子_初识Python
  20. android 多个fragment切换报错Caused by: java.lang.IllegalArgumentException: No view found for id 0x7f0800f

热门文章

  1. python带我起飞 百度云_CentOS/Debian安装人人影视客户端,下载资源并自动上传到OneDrive网盘...
  2. bootstrap bootstraptable 固定列_初识Bootstrap
  3. STL总结笔记(实用 / 比赛)
  4. 约瑟夫环问题 poj 1012 poj 2244
  5. php连接mysql代码+类_php连接mysql操作类
  6. java中printreader类_java字符流,字符文件输入流FileReader类介绍
  7. java画图类_JAVA绘图类_Graphics
  8. 智慧医院建设方案_【聚焦医改】安泰创新智慧医院建设方案惊艳中国医院院长大会!...
  9. 【UVA12230】Crossing Rivers(概率/期望)
  10. linux定时器无法重启pm2,在linux下开机启动pm2 不成功