-
2020-07-08 12:07:21
第一步、关闭操作数据库软件和数据库服务
关闭数据库软件就不说了,下面说关闭数据库服务。
以win10为例
“我的电脑”右键——>点击“管理”——>找到“服务和应用程序”双击点开——>找到“服务”双击点开——>找到MySQL后,右键点击停止。第二步、更改配置
找到MySQL文件夹下的my.ini配置,使用notepad++打开,在最后一行加入
transaction-isolation = READ-UNCOMMITTED
"="号后面就是你需要更改的事务隔离级别:#可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.正常情况下可以保存成功,如果保存不了,可能是权限出了问题。
解决方法:右键点击my.ini配置文件——>点击属性——>找到安全选项卡——>点击编辑——>选择Users,并将允许的那一列能点的都点上,之后点击确定、确定。
然后再次进行第二步即可。第三步、检验
在操作数据库软件上面输入SQL语句
select @@global.tx_isolation,@@tx_isolation;
Run 或者 Run selected ,即可看到事务隔离权限级别。以上是第一种,根本上进行事务隔离级别的改变
下面是第二种,暂时性进行事务隔离级别的改变
set session transaction isolation level read uncommitted;
#可选参数有:read uncommited, read commited, repetable read, serializable.更多相关内容 -
ORACLE数据库事务隔离级别介绍
2020-09-11 01:32:10事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度 -
MySQL数据库事务隔离级别详解
2020-12-16 04:53:45数据库事务隔离级别 数据库事务的隔离级别有4个,由低到高依次为 Read uncommitted:允许脏读。 Read committed: 防止脏读,最常用的隔离级别,并且是大多数数据库的默认隔离级别。 Repeatable read:可以防止脏... -
MySQL数据库事务隔离级别
2021-02-26 04:08:52数据库隔离级别有四种,应用《高性能mysql》一书中的说明:然后说说修改事务隔离级别的方法:1.全局修改,修改mysql.ini配置文件,在最后加上#可选参数有:READ-UNCOMMITTED,READ-COMMITTED,REPEATABLE-READ,... -
数据库事务隔离级别
2022-03-08 22:50:30数据库的事务隔离级别是事务特性ACID中的隔离性的解读,主要作用是提高数据库的并发性。 一、事务的特性(ACID) 分为4种...,分别解决了脏读、幻读、.......,mysql是默认可重复度。oracle是读已提交,一般不会...数据库的事务隔离级别是事务特性ACID中的隔离性的解读,主要作用是提高数据库的并发性。
一、事务的特性(ACID)
- 原子性:依赖于undo log(MVCC,多版本并发控制器,存储在磁盘)实现,会将原数据存储在undo log中,用于容灾。
- 一致性:最核心和最本质的要求,依靠于原子性、隔离性和持久性进行保证。
- 隔离性:依靠:锁(间隙锁),mvcc(多版本并发控制)来实现。
- 持久性:依赖于redo log日志来实现。
二、数据库事务隔离级别
数据库的事务隔离级别有四种,分别是读未提交、读已提交、可重复读、序列化,不同的隔离级别下会产生脏读、幻读、不可重复读等相关问题,因此在选择隔离级别的时候要根据应用场景来决定,使用合适的隔离级别。在实际的工作中很少做修改,一般都是使用默认的隔离级别:mysql默认为不可重复读,oracle为读已提交。
隔离级别 脏读 不可重复 读 幻读 READ- UNCOMMITTED √ √ √ READ-COMMITTED × √ √ REPEATABLE- READ × × √ SERIALIZABLE × × × 1、读未提交(READ-UNCOMMITTED)
事务的修改,即使没有提交,对其他事务也都是可见的。
事务能够读取未提交的数据,这种情况称为脏读。
2、读已提交(READ-COMMITTED)
事务读取已提交的数据,大多数数据库的默认隔离级别。
当一个事务在执行过程中,数据被另外一个事务修改,造成本次事务前后读取的信息不一样,这种情况称为不可重复读。
3、可重复度(REPEATABLE-READ )
这个级别是MySQL的默认隔离级别,它解决了脏读的问题,同时也保证了同一个事务多次读取同样的记录是一致的,但这个级别还是会出现幻读的情况。
幻读是指当一个事务A读取某一个范围的数据时,另一个事务B在这个范围插入行,A事务再次读取这个范围的数据时,会产生幻读。
4、序列化(SERIALIZABLE )
最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
三、事务隔离性的实现原理
事务隔离机制的实现基于锁机制和并发调度。其中并发调度使用的是MVVC(多版本并发控制),通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。锁机制采用的是间隙锁。
1、MVCC(多版本控制器)
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
MVCC多版本并发控制指的是维持一个数据的多个版本,使得读写操作没有冲突,在数据库的读操作中分为俩种:当前读和快照读。快照读是MySQL为实现MVCC的一个非阻塞读功能。
MVCC模块在MySQL中的具体实现是由三个隐式字段,undo日志、read view三个组件来实现的。
1.1 三个隐式字段
在数据库中除了我们自己创建的字段,其实表中还是存在很多隐式字段的。MVCC的实现就依赖了其中的三个隐式字段:DB_TRX_ID(事务id)、DB_ROLL_PTR(回滚指针)、DB_ROW_JD(隐式主键)。
DB_TRX_ID:6字节,最近修改事务id,记录创建这条记录或者最后一次修改该记录的事务id。
DB_ROLL_PTR:7字节,回滚指针,指向这条记录的上一个版本,用于配合undo log,指向上一个旧版本,在第一次插入数据时DB_ROLL_PTR为空。
DB_ROW_JD:6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个6字节的row_id,如果存在主键或者唯一字段就不存在DB_ROW_JD。
1.2 undo log
undo log被称之为回滚日志,表示在进行insert,delete,update操作的时候产生的方便回滚的日志。
当进行insert操作的时候,产生的undo log只在事务回滚的时候需要,并且在事务提交之后可以被立刻丢弃。
当进行update和delete操作的时候,产生的undo log日志不仅仅在事务回滚的时候需要,在快照读的时候也需要,所以不能随便删除,只有在快照读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除(当数据发生更新和删除操作的时候都只是设置一下老记录的deleted_bit,并不是真正的将过时的记录删除,因为为了节省磁盘空间,innodb有专门的purge线程来清除deleted_bit为true的记录,如果某个记录的deleted_id为true,并且DB_TRX_ID相对于purge线程的read view 可见,那么这条记录一定时可以被清除的)。
undo log日志采用的是链表的方式将数据进行链接。通过DB_ROLL_PTR回滚指针指向上次修改的位置。
记录链举例:(找的资料)
1、假设有一个事务编号为1的事务向表中插入一条记录,那么此时行数据的状态为:
正在上传…重新上传取消
2、假设有第二个事务编号为2对该记录的name做出修改,改为lisi
在事务2修改该行记录数据时,数据库会对该行加排他锁。然后把该行数据拷贝到undo log中,作为 旧记录,即在undolog中有当前行的拷贝副本。拷贝完毕后,修改该行name为lisi,并且修改隐藏字段的事务id为当前事务2的id,回滚指针指向拷贝到undolog的副本记录中。事务提交后,释放锁。
正在上传…重新上传取消
3、假设有第三个事务编号为3对该记录的age做了修改,改为32
在事务3修改该行数据的时,数据库会对该行加排他锁,然后把该行数据拷贝到undolog中,作为旧纪录,发现该行记录已经有undolog了,那么最新的旧数据作为链表的表头,插在该行记录的undolog最前面,修改该行age为32岁,并且修改隐藏字段的事务id为当前事务3的id,回滚指针指向刚刚拷贝的undolog的副本记录,事务提交,释放锁。
正在上传…重新上传取消
从上述的一系列图中,大家可以发现,不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log生成一条记录版本线性表,即链表,undolog的链首就是最新的旧记录,链尾就是最早的旧记录。
1.3 Read View
Read View是事务进行快照读操作的时候生产的读视图,在该事务执行快照读的那一刻,会生成一个数据系统当前的快照,记录并维护系统当前活跃事务的id,事务的id值是递增的。
在讲可见性之前,首先要知道Read View中的三个全局属性:
trx_list:一个数值列表,用来维护Read View生成时刻系统正活跃的事务ID
up_limit_id:记录trx_list列表中事务ID最小的ID
low_limit_id:Read View生成时刻系统尚未分配的下一个事务ID
具体的比较规则如下:
1、首先比较DB_TRX_ID < up_limit_id,如果小于,则当前事务能看到DB_TRX_ID所在的记录,如果大于等于进入下一个判断
2、接下来判断DB_TRX_ID >= low_limit_id,如果大于等于则代表DB_TRX_ID所在的记录在Read View生成后才出现的,那么对于当前事务肯定不可见,如果小于,则进入下一步判断
3、判断DB_TRX_ID是否在活跃事务中,如果在,则代表在Read View生成时刻,这个事务还是活跃状态,还没有commit,修改的数据,当前事务也是看不到,如果不在,则说明这个事务在Read View生成之前就已经开始commit,那么修改的结果是能够看见的。
四、参考文件
马士兵课程。
-
常见的数据库事务隔离级别
2020-12-14 08:35:30为什么会出现数据库的隔离级别呢? 数据库隔离级别是为了解决数据库并发访问过程中产生的各种数据安全问题. 事务的基本要素(ACID) 原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能... -
数据库事务隔离级别举例详解
2022-04-04 16:17:46数据库事务隔离级别,读未提交,读已提交,可重复读,串行化,举例说明详解,脏读,不可重复读,幻读。一、前言
本文主要对4种事务隔离级别,具体举例说明各自可能会存在的3种读现象的问题。
1.1、4种事务隔离级别
什么是隔离?
因为AB两事务存在时空冲突性,即执行时间和操作记录上都存在交集,否则就可以认为是不相关的,没有必要隔离。
那么4种事务隔离级别各自是什么,下面列出:读未提交,READ_UNCOMMITTED
,事务A可读到另一事务B未提交的变化。存在脏读、不可重复读、幻读问题。读已提交,READ_COMMITTED
,事务A在事务B提交后才可以读到B提交的变化。存在不可重复读、幻读问题。可重复读,REPEATABLE_READ
,事务A在事务B提交前后的两次读是一致的。存在幻读问题。串行化,SERIALIZABLE
,最高隔离级别,若事务AB操作有冲突,则AB竞争锁串行执行。
1.2、3种读现象
这里对
脏读
、不可重复读
和幻读
问题,各自举例描述。脏读,Dirty Read
,事务A读到了无效的脏数据。不可重复读,Non-repeatable Read
,事务A第一次读到了存在的某条记录,后面又读该记录(被事务B对刚刚存在的该记录update或delete),两次结果不一致。幻读,Phantom Read
,事务A第一次读到了某些结果集的数据,后面再次读,却读到了第一次中不存在的数据(被事务B在符合A第一次查询where条件的结果集中,insert了新的记录),两次结果不一致。
不可重复读和幻读,一般都是一个事务受到其他事务的影响,导致自身事务前后两次读结果不一致。
但是区别在于,不可重复读强调对先前存在的记录进行操作(对已存在的记录操作只能是update或delete),而幻读则强调对先前不存在的记录进行操作(对不存在的记录操作也只能是insert)。二、举例说明
在这里逐个举例说明各个事务隔离级别可能存在的读问题。
查看Spring中@Transactional
属性Isolation
的注释也可以发现,读未提交存在脏读、不可重复读、幻读,读已提交存在不可重复读、幻读,可重复读存在幻读,串行化防止脏读、不可重复读、幻读。ps,点击这篇数据库事务隔离级别举例详解(续)可以通过操作层面看到这些读问题。
下面的举例假设事务A、B一起执行。
2.1、读未提交
-
脏读:
时刻1,事务B修改Jay的工资由1爽(爽:货币计量单位,等于1.6亿元人民币)变为2爽,但没还提交;
时刻2,事务A是可以读到Jay的工资变成2爽;
时刻3,事务B试图提交但失败,导致回滚为1爽,那事务A读到的2爽就是脏数据,这就是一次脏读。 -
不可重复读(update的影响):
时刻1,事务A读到了Jay的工资是1爽;
时刻2,事务B更改了Jay的工资为2爽,但还没提交;
时刻3,事务A再读,这次读到2爽没问题,那事务A先后读到了同一记录的2种数据版本,这就是一次update导致的不可重复读。 -
不可重复读(delete的影响):
时刻1,事务A读到了Jay的工资是1爽;
时刻2,事务B删除Jay的工资记录,但还没提交;
时刻3,事务A再读,这次读不到Jay的工资记录,那也等同于事务A先后读到了同一记录的2种数据版本,这是一次delete导致的不可重复读。 -
幻读:
时刻1,事务A读到了Jay的工资有一条记录(select salary from pay_sheet where name=‘Jay’);
时刻2,事务B在薪资表pay_sheet中为Jay添加了一项额外的薪酬,但还没提交;
时刻3,事务A再查,这次查到莫名其妙多了一条记录,那事务A第二次的多读,就是一次insert导致的幻读。
2.1、读已提交
-
不可重复读(update的影响):
时刻1,事务A读到了Jay的工资是1爽;
时刻2,事务B更改了Jay的工资为2爽,且已提交;
时刻3,事务A再读,这次读到2爽没问题,那事务A先后读到了同一记录的2种数据版本,这就是一次update导致的不可重复读。 -
不可重复读(delete的影响):
时刻1,事务A读到了Jay的工资是1爽;
时刻2,事务B删除Jay的工资记录,且已提交;
时刻3,事务A再读,这次读不到Jay的工资记录,那也等同于事务A先后读到了同一记录的2种数据版本,这是一次delete导致的不可重复读。 -
幻读:
时刻1,事务A读到了Jay的工资有一条记录(select salary from pay_sheet where name=‘Jay’);
时刻2,事务B在薪资表pay_sheet中为Jay添加了一项额外的薪酬,且已提交;
时刻3,事务A再查,这次查到莫名其妙多了一条记录,那事务A第二次的多读,就是一次insert导致的幻读。
2.3、可重复读
- 幻读:
时刻1,事务A读到了Jay的工资有一条记录(select salary from pay_sheet where name=‘Jay’);
⚠️注意:这时候可重复读会将读到的这些记录行加锁,事务B没法去修改删除,但对事务B进行insert就没办法了,锁起不了作用。
时刻2,事务B在薪资表pay_sheet中为Jay添加了一项额外的薪酬,且已提交;
时刻3,事务A再查,这次查到莫名其妙多了一条记录,那事务A第二次的多读,就是一次insert导致的幻读。
2.4、串行化
串行化通过
读写锁
,读写写读写写互斥,读读不互斥的锁机制,牺牲数据库的并发性能,避免了脏读、不可重复读和幻读的问题。 -
MSSQL与Oracle数据库事务隔离级别与锁机制对比
2020-12-16 04:05:25只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态。 Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性。同时,并行事务的修改必须与其他并行... -
面试题之数据库事务隔离级别
2020-01-01 22:09:49为了解决脏读、不可重复读、幻读,数据库提供了事务隔离级别的概念,可以最大程度地避免以上三种情况的发生。 根据隔离程度从低到高分为: Read Uncommitted(读未提交); Read Committed(读已提交); ...一、简介
为了解决脏读、不可重复读、幻读,数据库提供了事务隔离级别的概念,可以最大程度地避免以上三种情况的发生。
根据隔离程度从低到高分为:
- Read Uncommitted(读未提交);
- Read Committed(读已提交);
- Repeatable Read(可重复读);
- Serializable(串行化);
二、详解
下面对各个隔离级别做一个简介:
- Read Uncommitted(读未提交):最低的隔离级别,但是并发性能最高,指的是一个事务可以读取到另外一个事务并未提交的数据。如果一个事务已经开始写数据,则另外一个事务则不允许同时进行写操作,但允许其他事务读此行数据(写操作加写锁,读操作不加锁)。读未提交会出现脏读、不可重复读、幻读。
- Read Committed(读已提交):指的是一个事务的更新操作在未提交之前,另外一个事务是读取不到同一数据更新后的结果,这就避免了脏读。读已提交会锁定当前正在读取的行的数据( 写操作加写锁,读操作加读锁)。读已提交避免了脏读,但是会出现不可重复读、幻读问题。
- Repeatable Read(可重复读):mysql的默认的隔离级别,指的是在一个事务内,对相同条件的数据读取结果是相同的,不管其他事务有没有对其进行更新,也不管更新是否已经提交到数据库。可重复读会锁定读取到的所有行直到事务结束,其他事务的更新操作只能等到事务结束之后才能进行。可重复读避免了脏读、不可重复读,但是会出现幻读问题。
- Serializable(串行化):最高的隔离级别,当然并发性能最低。指的是所有的事务操作依次顺序执行,事务只能一个接着一个执行,不能并发执行。可序列化对表进行加锁,可以有效避免脏读、不可重复读、幻读问题,但是效率比较低,通常会用其他并发级别加上相应的并发锁机制来取代它。
注意:在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。
三、总结
下面通过一张表格展示各个隔离级别对脏读、不可重复读、幻读问题的处理:
事务隔离级别
脏读
不可重复读
幻读
Read Uncommitted(读未提交)
可能会出现
可能会出现
可能会出现
Read Committed(读已提交)
不会出现
可能会出现
可能会出现
Repeatable Read(可重复读)
不会出现
不会出现
可能会出现
Serializable(串行化)
不会出现
不会出现
不会出现
- 隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大(事务的隔离级别和数据库并发性是成反比的,隔离级别越高,并发性越低)。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、幻读这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
- 不可重复读和读提交的区别:
- 不可重复读:读操作会锁定读取到的所有行直到事务结束,可重复读的锁粒度更大;
- 读提交:读操作是加锁到本次读操作结束,读提交的锁粒度相对较小;
-
】数据库事务/事务的作用/数据库事务ACID属性 / 特性/事务的隔离性/数据库事务隔离级别/ 数据库的隔离级别...
2021-01-19 21:53:38数据库事务: 针对数据库的某一组操作要么全部成功,要么全部失败。 事务的作用 1:保证数据的完整性,失败后可以恢复到原来状态 2:事务与事务之间互不干扰,这样数据会更加安全 数据库事务ACID属性 / 特性 原子性... -
spring事务隔离级别与数据库事务隔离级别的关系
2019-02-18 16:21:37一直没搞清楚spring事务与数据库事务与锁之间的关系。 spring事务: spring事务本质上使用数据库事务,而数据库事务本质上使用数据库锁,所以spring事务本质上使用数据库锁,开启spring事务意味着使用数据库锁; ... -
MySQL数据库事务隔离级别介绍(Transaction Isolation Level)
2020-12-15 03:36:51然后说说修改事务隔离级别的方法: 1.全局修改,修改mysql.ini配置文件,在最后加上 代码如下: #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE. [mysqld] transaction-... -
SQL数据库事务隔离级别总结
2022-01-23 11:45:38概念 保证一个事务的正确性,需要保证: ...如果不对事务进行隔离,多个事务同时发生在数据库中,将会导致以下的问题: 脏读:一个事务读取到另一个未提交事务的修改。没保证原子性,如果当前事务基于这些 -
mysql数据库事务隔离级别借鉴.pdf
2021-12-10 13:47:37mysql数据库事务隔离级别借鉴.pdf -
数据库事务隔离级别及脏读、不可重复读、幻读的理解
2018-08-30 16:25:36开篇声明,由于两位大佬排版不够美观,然后又发现一些歧义,因此我集百家之所长,精心整理并排版良好,可放心阅读。 ... 一、数据库事务正确执行的四个基本要素 1.1ACID... -
mysql数据库事务隔离级别[参照].pdf
2021-10-11 04:54:33mysql数据库事务隔离级别[参照].pdf -
数据库事务隔离级别-- 脏读、幻读、不可重复读
2021-05-16 17:09:40一 数据库事务的隔离级别 数据库事务的隔离级别有4个,由低到高依次为Read uncommitted 、Read committed 、Repeatable read 、Serializable,这四个级别可以逐个解决脏读 、不可重复读 、幻读这几类问题。 1. Read... -
数据库事务隔离级别.docx
2018-04-20 10:02:44数据库事务隔离级别.docx数据库事务隔离级别.docx数据库事务隔离级别.docx -
MySql数据库事务隔离级别底层实现原理总结
2022-03-20 22:53:59众所周知,事务的隔离级别有四个等级,分别是读未提交(RU),读已提交(RC),可重复读(RR)与串行化(Serial),通过设置隔离级别,可以解决事务并发过程中导致的脏读,不可重复读与幻读。那么隔离级别解决这些问题... -
Spring事务隔离级别与数据库隔离级别不一致时,该以谁为准?
2021-01-19 22:53:27项目中,以 Spring 事务为准,因为他重写了数据库的隔离级别,但没有直接修改数据库的隔离级别 -
数据库事务以及事务的隔离级别
2020-12-14 22:30:47事务的四个属性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。 1.原子性(Atomic) 重要的原则,也是容易理解的原则。被事务管理的所有方法,要么一起被提交,... -
数据库锁 与 事务隔离级别
2022-02-27 16:22:40这个得看数据库引擎的事务的隔离级别。 事务的隔离级别与锁的关系: 没有隔离级别(不加事务???不对,应该是开启了事务,但是没有隔离级别),这个时候会发生脏写问题: 两个线程操作同一条数据,对其进行更新...