首页 > 编程知识 正文

关于mysql的事务隔离级别,oracle事务默认隔离级别

时间:2023-05-03 22:32:11 阅读:47187 作者:557

在许多MySQL存储引擎中,只有InnoDB支持事务,这里的事务隔离级别是指InnoDB下的事务隔离级别。

一、事务的基本要素(ACID ) )。

原子(原子; 事务开始后的所有操作,要么全部结束,要么全部不做,不能中途停滞。

一致性:在事务开始之前和结束之后,数据库的完整性约束没有受到损害。

隔离(Isolation ) )一次只允许一个事务请求相同的数据,而不同事务之间没有任何干扰。

持久性(Durability ) :事务完成后,事务对数据库的所有更新都将保存在数据库中,并且无法回滚。

二、事务同步问题

脏读:事务b修改了数据但未提交。 事务a读取数据,然后b回滚时,a正在读取脏数据。

不要重复。 事务a首先读取数据,事务b修改并提交数据,事务a第二次读取数据,两次数据不匹配。

幻读:事务处理a更新表中的所有行,事务处理b插入一行后,事务处理a会发现表中有未修改的行。 (一般进行间隙锁定)

三. MySQL事务隔离级别

事务隔离级别

潦草的读法

不要重复

幻读

阅读未读提交

能做到

能做到

能做到

阅读已提交

做不到

能做到

能做到

可重复读取

做不到

做不到

能做到

串行的故事

做不到

做不到

做不到

mysql缺省事务隔离级别“showglobalvariableslike‘tx _ isolation”; ”

数据库的锁定将添加到数据行的相应索引中

===================悲观锁定方向===================

四. InnoDB行锁定模式

Innodb的行锁定模式包括共享锁定、排他锁定、意向共享锁定(表锁定)、意向排他锁定(表锁定)和间隙锁定。

1 .共享锁定

也称为读取锁定,是通过读取操作创建的锁定。 锁上后,您将无法修改任何内容,但您可以同时读取数据或将其锁定为共享。

2 .排他锁定

也称为写锁定,事务对数据a施加独占锁定后,其他东西不能同时读取数据。 另外,不能对a进行任何种类的锁定。 允许独占锁定的事务既可以读取数据,也可以修改数据。

在MySQL InnoDB中,UPDATE/INSERT/DELETE操作会自动进行独占锁定。 常规的SELECT语句不锁定任何内容。 如果想锁定,请使用以下方法

select * from table _ name where id=1lockinsharemode; -显式共享锁定

select * from table _ name where id=1for update; -明确地进行排他锁定

3 .意向锁定(数据库自动添加) ) ) ) ) ) ) )。

InnoDB为了使表锁和行锁共存而使用了意向锁。 (意大利锁都是时钟级锁)

既然事务a锁定了某行,其他事务就不能修改此行。 这与“当事务b锁定整个表时,可以修改表中的任何行”相冲突。 所以,没有方向锁的时候,行锁和表锁共存有问题!

意向共享锁定:表示事务处理准备对数据行施加共享锁定(行读锁定s ),先施加意向共享锁定IS

意在排他锁定:事务准备向数据行添加排他锁定(行写入锁定x ),首先意在排他锁定IX

事务a在申请行写锁定之前,数据库会自动排他地锁定事务a申请书的意向。 Web申请表写锁定时,Web申请表的写锁定将被阻止,因为表中已有独占锁定的意向。

IX、IS只是表示要申请page、记录等更低级别元素的x、s操作,所以是相互兼容的

4 .记录锁、间隙锁、临键锁、有意插入锁

=========================乐观的部分===============

美国全国广播公司

多版本并发控制(multi-versionconcurrencycontrol )是为了解决读写冲突而发生的。

在MySQL中,多版本并发控制是InnoDB存储引擎实现读取提交、读取取消提交和隔离级别的具体方法。 未提交的读取始终读取最新的数据行,不需要使用MVCC; 要实现序列化,必须锁定所有读取的行,而不能仅通过MVCC实现。

MVCC一般使用两种实现方式,InnoDB采用后者

实时保留数据的一个或多个历史版本

根据需要从还原日志创建历史版本

InnoDB在每个记录行中实现了三个隐藏字段

6字节的事务id(data_Trx_id )标记上次更新此记录的事务id

7字节回滚指针(RAR_ROLL_PTR )指向当前和正在录制的回滚段的还原日志记录,其中查找先前版本的数据通过该指针

6字节的

DB_ROW_ID字段包含一个行ID,当插入新行时,该行ID会单调增加。如果 InnoDB自动生成聚簇索引,索引包含行ID值。否则,该 DB_ROW_ID列不会出现在任何索引中。

另外,每条记录的头信息(record header)里都有一个专门的bit(deleted_flag)来表示当前记录是否已经被删除

更新字段时会进行如下操作

用排他锁锁定该行

记录redo log

把该行修改前的值复制到undolog,即上图中下面的行。。

修改当前行的值,填写事务编号,回滚指针指向undo log刚刚copy的行

select

InnoDB只查找版本号小于等于当前事务版本的数据行,这样可以确保数据行要么是在开始之前已经存在 了,要么是本事务自身插入或修改过的

行的删除版本号 要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行,在事务开始之前未被删除。

insert  InnoDB为新插入的每一行保存当前事务版本号作为事务ID

delete  InnoDB为删除的每一行保存当前事务版本号作为事务ID

update InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号, 同事保存当前系统版本号到原来的行作为行删除标识符

对于READ_COMMITTED

读提交是,读事务每次都读取undo log中最近的版本,因此每次都能读取到最新的数据。

MySQL的读一致性,是通过一个叫read view的结果来实现的。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。