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 语句根据条件扫描到的可能需要加锁的数据范围;
以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)