mysql事务的四大特性以及隔离级别

硅谷探秘者 4814 0 0

事务的四大特性

        一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)


原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务的并发问题

脏读:事务A读取了事务B更新的数据,然后事务B回滚,那么事务A读取到的数据就是脏数据

不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中对数据做了更新并提交,导致事务A多次读取同一数据的结果不一致,侧重于修改

幻读: 系统管理员A将数据库中所有的学生的成绩从具体分数改为ABCD等级,同时系统管理员B插入了或删除了一条具体分数的记录,导致A发现结束后还有一条数据没有改过来或是丢失了,就好像出现了幻觉一样

事务的隔离级别

读未提交(read-uncommitted),读提交(read-committed),可重复读(repeatable-read),串行化(serializable)

QQ截图20190819210842.png

案例:

首先设置和查询数据库的隔离级别,如下

QQ截图20190818200451.png

以下的几种设置方式相似。

1.读未提交(read-uncommitted)

QQ截图20190818200122.png

结论:客户端A可以读取到客户端B修改后但未提交的数据,一旦客户端B的事务因为某种原因回滚,所有的操作都将会被撤销,那客户端A查询到的数据其实就是脏数据。

2.读提交(read-committed)

QQ截图20190818210748.png

结论:客户端B的事务还没提交,客户端A不能查询到B已经更新的数据,解决了脏读问题,但是客户端A执行与上一步相同的查询,结果与上一步不一致,即产生了不可重复读的问题。

3.可重复读(repeatable-read)

QQ截图20190818212112.png

解决了不可重复读的问题,但是看下图:

QQ截图20190819205044.png

出现幻读问题。

结论:客户端A在查询过程中,客户端B有数据修改并提交事务,客户端A再查询和上一步结果相同,解决了不可重复读的问题,但是还会存在幻读的问题。比如客户端A查询时没有id为1的数据,此时客户端B向表中插入一条数据id为1并提交,这时客户端A任然以位数据库中没有id为1的数据,于是插入一条id为1的数据,结果报错了,就发生了幻读的问题。

串行化(serializable)

串行化利用加锁的方式,在这个事务没有被提交之前其他的线程,只能等到当前操作完成之后,才能进行操作,这样会非常耗时,而且,影响数据库的性能,通常情况下,不会使用这种隔离级别。但是这种方式解决了幻读的问题。



评论区
请写下您的评论...
暂无评论...
猜你喜欢
linux 1017 换成另一个新概念—目标(target)。  家都知道Windows有安全模式,它是Windows最小模式,和普通模式相比,安全模式可让用户更好地进行系统检测错误修复。Linux运行是个
框架 1277 :onMatch=”ACCEPT”表示匹配该上onMatch=”DENY”表示不匹配该上onMatch=”NEUTRAL”表示该,由下一个filter处理,如果当前是最后一
算法基础 1102 1.InnoDB支持,MyISAM不支持2.InnoDB支持外键,而MyISAM不支持。对一个包含外键InnoDB表转为MYISAM会失败3.InnoDB是聚集索引,使用B+Tree作为索
算法基础 914 只能单向移动。(2)Iterator.remove()是唯一安全方式来在迭代过程中修改集合;如果在迭代过程中任何其它方式修改了基本集合将会产生未知行为。而且每调用一次next()方法,remov
算法基础 992 一个中,加入到这个中。这是最常见选择。PROPAGATION_SUPPORTS支持当前,如果当前没有,就方式执行。PROPAGATION_MANDATORY使用当前,如果
算法基础 1204 Java中遍历集合方式list集合为例,有三种遍历方式。ListStringlist=newArrayList(); list.add("2"); list.add("2"); list.add
weblog 1566 layuitable表格单选件监听选中数据获取表格设置table.render({ elem:'#test' ,url:'[[@{/smmc/artificial}]]'+'?xsId
数据结构与算法 9111 问题描述:思路:遍历1-n个数,判断是否满足条件。代码:packageclub.test;publicclassTestMain11{ publicstaticvoidmain(String[]args){ intnum=0; for(inti=1;i=10000;i++){ if(hasGivenNum(i)){ num+=i; } } System.out.println
归档
2018-11  12 2018-12  33 2019-01  28 2019-02  28 2019-03  32 2019-04  27 2019-05  33 2019-06  6 2019-07  12 2019-08  12 2019-09  21 2019-10  8 2019-11  15 2019-12  25 2020-01  9 2020-02  5 2020-03  16 2020-04  4 2020-06  1 2020-07  7 2020-08  13 2020-09  9 2020-10  5 2020-12  3 2021-01  1 2021-02  5 2021-03  7 2021-04  4 2021-05  4 2021-06  1 2021-07  7 2021-08  2 2021-09  8 2021-10  9 2021-11  16 2021-12  14 2022-01  7 2022-05  1 2022-08  3 2022-09  2 2022-10  2 2022-12  5 2023-01  3 2023-02  1 2023-03  4 2023-04  2 2023-06  3 2023-07  4 2023-08  1 2023-10  1 2024-02  1 2024-03  1 2024-04  1
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础 xxl-job rabbitmq haproxy srs 音视频 webrtc javascript
目录
没有一个冬天不可逾越,没有一个春天不会来临。最慢的步伐不是跬步,而是徘徊,最快的脚步不是冲刺,而是坚持。