如何61禁用数据库快照隔离功能

如何61禁用数据库快照隔离功能,第1张

USEMASTERGOALTERDATABASEstudbMODIFYFILE(NAME=STU_DT,SIZE=5MB,MAXSIZE=20MB,FILEGROWTH=1MB)GOALTERDATABASEstudbADDLOGFILE(NAME=studb_log2,FILENAME='C:\STUDB_LOG2.LDF',SIZE=5MB,MAXSIZE=10MB)GO

修改方法

有两种方法可以对配置了 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 语句根据条件扫描到的可能需要加锁的数据范围;

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

在工作中,经常会接触到事务这个概念。涉及到事务,大家首先想到的就是事务的四个特性:ACID。

1.原子性(Atomicity)

1.1什么是原子性

一般来说,原子是指不能分解成小部分的东西。这个词在计算的不同分支中意味着相似但又微妙不同的东西。例如,在多线程编程中,如果一个线程执行一个原子 *** 作,这意味着另一个线程无法看到该 *** 作的一半结果。系统只能处于 *** 作之前或 *** 作之后的状态,而不是介于两者之间的状态。 ACID原子性的定义特征是:能够在错误时中止事务,丢弃该事务进行的所有写入变更的能力。

1.2 如何实现原子性

WAL(预写日志) 是用于保证事务的原子性和持久性。简单来讲,事务更新数据之前,先写日志,然后在更新数据。当系统崩溃时,如果事务还没写WAL,那整个数据依然一致。如果事务只写了WAL,未更新具体的数据页后崩溃,那恢复流程可以根据WAL日志,重做相关 *** 作,保证数据一致性。

2.一致性(Consistency)

ACID一致性的概念是,对数据的一组特定陈述必须始终成立。即不变量(invariants)。例如,在会计系统中,所有账户整体上必须借贷相抵。如果一个事务开始于一个满足这些不变量的有效数据库,且在事务处理期间的任何写入 *** 作都保持这种有效性,那么可以确定,不变量总是满足的。 原子性,隔离性和持久性是数据库的属性,而一致性(在ACID意义上)是应用程序的属性。应用可能依赖数据库的原子性和隔离属性来实现一致性,但这并不仅取决于数据库。

3.隔离性(Isolation)

3.1什么是隔离性

大多数数据库都会同时被多个客户端访问。如果它们各自读写数据库的不同部分,这是没有问题的,但是如果它们访问相同的数据库记录,则可能会遇到并发问题(竞争条件(race conditions))。 ACID意义上的隔离性意味着,同时执行的事务是相互隔离的:它们不能相互冒犯。

如果两个事务不触及相同的数据,它们可以安全地并行(parallel) 运行,因为两者都不依赖于另一个。当一个事务读取由另一个事务同时修改的数据时,或者当两个事务试图同时修改相同的数据时,并发问题(竞争条件)才会出现。出于这个原因,数据库一直试图通过提供事务隔离(transaction isolation) 来隐藏应用程序开发者的并发问题。

serializable级别的隔离,保证事务的效果与连续运行(即一次一个,没有任何并发)是一样的,可以保证事务地安全执行。但是在serializable隔离级别,事务并发度很低,整个数据库的性能肯定不高。这时候,数据库开发人员有提出了四种不同的隔离级别,来平衡事务并发度与隔离性,这四个隔离级别分别是:

读未提交(Read Uncommitted):可以读取未提交的记录。

读已提交(Read Committed):事务中只能看到已提交的修改。

可重复读(Repeatable Read):解决了不可重复读问题(MySQL 默认隔离级别)

序列化(Serializable):最高隔离级别。

RU,RC和RR由于降低了隔离要求,自然在读取数据时,会产生各种异常(上帝为你打开一扇门的同时,肯定也为你关上一扇窗):

RU会读取其他事务未提交的数据,这就产生了脏读,脏读取意味着另一个事务可能会只看到一部分更新,或者看到的数据已经被回滚了。

RC级别的隔离,会产生不可重复读的问题。所谓不可重复读是指在一个事务内根据同一个条件对行记录进行多次查询,但是搜出来的结果却不一致。发生不可重复读的原因是在多次搜索期间查询条件覆盖的数据被其他事务修改了。

RR级别的隔离,会产生幻读问题。幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select *** 作得到的结果所表征的数据状态无法支撑后续的业务 *** 作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

3.2 如何支持隔离性

一般数据库不会考虑工作在RU隔离级别,因为读脏数据会引起太多的问题。数据库一般工作在RC或RR隔离级别,快照隔离级别就可以支持RC或RR隔离级别,所以数据库一般会实现快照隔离级别。

快照隔离的实现通常使用写锁来防止脏写,这意味着进行写入的事务会阻止另一个事务修改同一个对象。但是读取不需要任何锁定。从性能的角度来看,快照隔离的一个关键原则是:读不阻塞写,写不阻塞读。这允许数据库在处理一致性快照上的长时间查询时,可以正常地同时处理写入 *** 作。且两者间没有任何锁定争用。

为了实现快照隔离,数据库必须保留一个对象的几个不同的提交版本,因为各种正在进行的事务可能需要看到数据库在不同的时间点的状态。因为它并排维护着多个版本的对象,所以这种技术被称为多版本并发控制(MVCC, multi-version concurrentcy control)。

最高的隔离级别:Serializable,一般是通过2PL来实现, 一阶段申请,一阶段释放。读写都要加锁。

4.持久性(Durability)

数据库系统的目的是,提供一个安全的地方存储数据,而不用担心丢失。持久性 是一个承诺,即一旦事务成功完成,即使发生硬件故障或数据库崩溃,写入的任何数据也不会丢失。


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

原文地址: https://outofmemory.cn/sjk/10871404.html

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

发表评论

登录后才能评论

评论列表(0条)

保存