如何查看mysql使用的是哪一种隔离机制?

如何查看mysql使用的是哪一种隔离机制?,第1张

select @@tx_isolation

该语句可以查看数据库的隔离级别

SQL中定义有四个隔离级别:

READ UNCOMMITTED 读未提交 ,该隔离级下可以看见其他用户正在修改但是还没有提交的数据,会给用户造成修改丢失,并且会脏读数据。

READ COMMITTED 读已提交,该隔离级别下数据不可重复读,并且会幻读。

REPEATABLE READ 可重复读,该隔离级别为MySQL默认的隔离级别。该隔离级别会存在幻读。

SERIALIZABLE 可读不可写。可读取数据,要写入数据必须要等待另一个事务结束。不存在脏读,不可重复读,幻读的问题。

事务隔离级别主要解决一下问题:

脏读:A、B两个事务,事务A修改某一个数据并将其写回磁盘,事务B读取同一数据后,A由于某种原因被撤销,事务回滚,这时A修改过的数据恢复原值。B读取到的数据和数据库中的数据不一致,所以B读到的数据就是脏数据。

不可重复读:A读取数据后,B事务执行更新 *** 作,使A无法再现前一次的读取结果。不可重复读主要包括三种情况:

(1)事务A读取某一数据后,事务B对其进行修改,当A再次读该数据时,得到与前一次不同的值。

(2)事务A按一定条件从数据库中读取了某些数据,事务B 删除了其中部分数据,当A 再按照相同的条件读取数据时,数据变少了。

(3)事务A按一定条件读取数据后,事务B插入了一些数据,A再次读取时数据会变多。

第二种情况和第三种情况也称为幻读。

修改丢失:两个事务A、B读入同一数据并修改,A提交的修改结果被B提交的修改覆盖,导致A修改的数据丢失。

MySQL 中事务的隔离级别一共分为四种,分别如下:

序列化(SERIALIZABLE):如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。

可重复读(REPEATABLE READ):在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。

提交读(READ COMMITTED):READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。处于 READ COMMITTED 级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。

未提交读(READ UNCOMMITTED):READ UNCOMMITTED 提供了事务之间最小限度的隔离。除了容易产生虚幻的读 *** 作和不能重复的读 *** 作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化。

应用环境

与其他的大型数据库例如 Oracle、DB2、SQL Server等相比,MySQL自有它的不足之处,但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说,MySQL提供的功能已经绰绰有余,而且由于 MySQL是开放源码软件,因此可以大大降低总体拥有成本。

为了给程序配置资源隔离,通常我们会到 cgroup 层级树下的控制器⾥,创建或者修改控制组⽂件。

修改方法

有两种方法可以对配置了 systemd 的程序进行资源隔离:1. 命令行修改:通过执行 systemctl set-property 命令实现,形式为 systemctl set-property name parameter=value;修改默认即时生效。2. 手工修改文件:直接编辑程序的 systemd unit file 文件,完成之后需手工执行 systemctl daemon-reload 更新配置,并重启服务 systemctl restart name.service。

systemd unit file 里支持的资源隔离配置项,如常见的:

CPUQuota=value

该参数表示服务可以获取的最大 CPU 时间,value 为百分数形式,高于 100% 表示可使用 1 核以上的 CPU。与 cgroup cpu 控制器 cpu.cfs_quota_us 配置项对应。

MemoryLimit=value

该参数表示服务可以使用的最大内存量,value 可以使用 K, M, G, T 等后缀表示值的大小。与 cgroup memory 控制器 memory.limit_in_bytes 配置项对应。

事务的4种隔离级别

READ UNCOMMITTED       未提交读,可以读取未提交的数据。

READ COMMITTED         已提交读,对于锁定读(select with for update 或者 for share)、update 和 delete 语句,InnoDB 仅锁定索引记录,而不锁定它们之间的间隙,因此允许在锁定的记录旁边自由插入新记录。                    

Gap locking 仅用于外键约束检查和重复键检查。

REPEATABLE READ        可重复读,事务中的一致性读取读取的是事务第一次读取所建立的快照。

SERIALIZABLE           序列化在了解了 4 种隔离级别的需求后,在采用锁控制隔离级别的基础上,我们需要了解加锁的对象(数据本身&间隙),以及了解整个数据范围的全集组成。

数据范围全集组成

SQL 语句根据条件判断不需要扫描的数据范围(不加锁);

SQL 语句根据条件扫描到的可能需要加锁的数据范围;

以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8636210.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存