博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
2020/01/29 02-事务ACID和隔离级别
阅读量:3921 次
发布时间:2019-05-23

本文共 1202 字,大约阅读时间需要 4 分钟。

事务是由若干条语句组成的,指的是要做的一系列操作。

关系型数据库中支持事务,必须支持4个属性,ACID
A 原子性 atomicity 一个事务是一个不可分割的工作单位,事务中包括的所有操作要么全部做完,要么什么都不做
C 一致性 consistency 事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的
I 隔离性 isolation 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离 , 的,并发执行的各个事务之间不能互相干扰
D 持久性 durability 持久性也称永久性(permanence)。指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响
在这里插入图片描述
原子性,事务要么不做,要么做完
在这里插入图片描述
**并行执行事务和顺序执行事务的结果应该一致,当这些操作做完之后,多个事务执行完,要求并行执行和排队执行结果是一致的 **
在这里插入图片描述
每个事务的操作不互相干扰,在这里插入图片描述
事务一旦提交成功,数据库的改变就应该永久保存下来
在这里插入图片描述
做到这4点,才能叫支持事务的数据库,mysql的myisam不支持事务,innodb支持事务,一般需要解释下ACID,原子性,一致性(要求并行,且互不干扰),隔离性,持久性,

隔离级别

在这里插入图片描述

在这里插入图片描述
隔离性不好,会带来一些问题:
1.更新丢失
2.脏读
3.不可重复读 UNrepeatable read
4.幻读phantom read

这种隔离性最好不要使用,无法保证数据最后是什么样子,丢失更新是非常严重的问题

在这里插入图片描述
脏数据,一般是事务还没真正提交的,一个数据的中间状态,支付系统如果不加事务,是要出大问题的,每一笔操作要产生真正的影响才能使用,读到脏数据的行为称为脏读。
脏读可以读到未提交的数据
在这里插入图片描述
就是在一个事务里看到了别的事务修改的数据,这是不可重复读,也就是同一条语句看到的结果不一样。
相同的记录里面的数据发生了变化
在这里插入图片描述
幻读,不可重复读的升级版,同一个事务可以看到对方事务提交的数据
在这里插入图片描述
RDBMS关系型数据库需要解决隔离性不好带来的问题,提供了4个隔离级别
在这里插入图片描述
未提交读
在这里插入图片描述
提交读
在这里插入图片描述
可重复读
在这里插入图片描述
串行化,事务不并行了
在这里插入图片描述
隔离级别越高串行化越高,效率越低
在这里插入图片描述
隔离级别有会话设定和全局设定,每一个数据库链接就是一个会话
在这里插入图片描述
查询当前隔离界别
在这里插入图片描述
串行化等于A线程JOIN,其他线程都卡住,串行化并不能利用足够的资源,效率很低在这里插入图片描述
可重复读,innodb是行级锁,比表级锁提高并发效率。
1.对select加锁,不允许其他事务删除、修改的操作
只要A事务不提交,反复查都用一个快照,就不会出现一个数据变化,往往快照解决不可重复读问题,如果快照左的号,也可以顺便解决幻读。
在这里插入图片描述
读已提交,读到的是已经提交的,并发性能更好
在这里插入图片描述
读,未提交,没有隔离性可言在这里插入图片描述
事务要么打开提交,要么打开回滚,mysql有自动提交,性能很差,开发的时候需要关闭
在这里插入图片描述

转载地址:http://pxzgn.baihongyu.com/

你可能感兴趣的文章
define小结
查看>>
C99标准更新
查看>>
c语言中的内存对齐
查看>>
BlueZ HID不安全设备连接漏洞
查看>>
指针变量的运算
查看>>
蓝牙模块在HHARM2410上的移植
查看>>
linux环境变量文件
查看>>
守护进程
查看>>
glib 中 IO Channels 理解
查看>>
[linux]警告:检测到时钟错误。您的创建可能是不完整的。
查看>>
动态库的Makefile.am编写
查看>>
蓝牙1.1、蓝牙1.2、蓝牙2.0的关键区别
查看>>
循环队列操作实现
查看>>
linux的信号
查看>>
glib 中 IO Channels 理解
查看>>
C++中extern “C”含义深层探索
查看>>
extern用法详解(转)
查看>>
如何在Linux下用C/C++语言操作数据库sqlite3
查看>>
SQLite的数据类型
查看>>
使用sqlite3与C接口开发数据库程序 - [编程]
查看>>