博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试中的数据库基本知识(事务,事务并发,事务隔离)
阅读量:3909 次
发布时间:2019-05-23

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

事务的定义

数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成

事务的特性(ACID)

1:原子性:事务包含的所有操作要么全部成功,要么全部失败回滚;成功必须要完全应用到数据库,失败则不能对数据库产生影响;

2:一致性:事务执行前和执行后必须处于一致性状态,
例:用户A和用户B的前加起来一共是5000; 无论AB用户之间是如何相互转换的,事务结束后两个用户的钱加起来还是5000,这就是事务的一致性。
3:隔离性:当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不被其他事务的操作所干扰,多个并发事务之间要相互隔离;
4:持久性:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便在数据库系统遇到故障的情况下也不会丢失事物的操作。

如果不考虑事务的隔离性,事务的并发将会导致以下四个问题:

(1)丢失更新(Mysql已经几乎能够避免这种现象的发生,故很多博客或者书籍不讨论这种情况):

丢失更新就是两个不同的事务在某一时刻对同一数据进行读取后,先后进行修改。导致第一次操作数据丢失

取款事务 取款事务
开始事务 开始事务
查询余额为100
查询余额为100
转入20,余额变为120(与取款事务读取的余额数据不一样,导致了回滚)
提交事务
取出10,余额变为90
回滚,余额变为100 丢失更新

(2)脏读

A事务读到了B事务未提交的数据

取款事务 取款事务
开始事务 开始事务
查询余额为100
转入20,余额变为120
读取余额,120(脏数据
发生错误,回滚,余额变为100
转入20,余额为140(实际应该是120)
提交事务

(3)不可重复读

一个事务前后多次读取同一数据,数据内容不一致
这个比较好理解,在A事务读取数据Data之后,事务B对Data进行修改,A再读取后发现数据不一致,导致了错误
难理解的点在于:书上和网上给的例子大多没有说明不可重复读的危害,读本身不存在什么危害,而是基于读到数据做的计算就可能出现问题。
举个例子:
事务 A:select 最近 1 个月注册的新用户,把他们的级别改成 A
事务 B:注册了一个新用户Mike,提交
事务 A:select 最近 1 个月注册的新用户,给他们发送一条私信:恭喜你升级为 A !(但Mike并没有升级为A)
(4)幻读
事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。

事务的隔离级别

最高级为serializable(所有级别都能避免丢失更新)

在这里插入图片描述
1、事务隔离级别为不可重复读时,写数据只会锁住相应的行
2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。 3、事务隔离级别为串行化时,读写数据都会锁住整张表(只能进行读-读并发)
4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大

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

你可能感兴趣的文章
位图(BitMap)&& 布隆过滤器(BloomFilter)
查看>>
总结: 笔试中常见virtual函数问题
查看>>
vue中使用mock模拟后端数据
查看>>
常见的数据库有哪几种?
查看>>
Java后端的SQL语句
查看>>
注意:eclipse使用自己的编译器
查看>>
Class对象的获取方法
查看>>
URI与URL的区别
查看>>
关于鼓励、加油的英语句子
查看>>
AWT事件的继承关系图
查看>>
设计模式之迭代器(Iterator Pattern)-笔记
查看>>
Python入门(P_SDK的安装与使用)
查看>>
为什么XML文档的格式是否规范如此重要呢?为何W3C规定XML处理器不应尝试修复不规范的文档
查看>>
编写高效的Android代码
查看>>
位运算符的使用总结(编辑网络的资源)
查看>>
RMS使用时要注要的地方
查看>>
android简单demo学习系例之菜单实现
查看>>
显示python库路径
查看>>
android简单demo学习系例之排版(LinearLayout)[xml-based]
查看>>
J2ME相关的开源项目
查看>>