SinoDB数据库隔离级别

 本文主要对SinoDB数据库隔离级别及其设置进行介绍。

1. ANSI SQL-92事务隔离

ANSI 委员会定义了以下级别的事务隔离(SQL-92):

  • Read uncommitted
  • Read committed
  • Repeatable read
  • Serializable read

  查询的隔离级别决定了查询与其他并发执行的UPDATE,DELETE和INSERT语句所做的修改的隔离程度。SinoDB支持ANSI委员会定义的这四个事务隔离级别。

2. SinoDB动态服务器隔离级别

2.1 隔离级别对比

ANSI 级别SET TRANSACTIONSET ISOLATION
Read uncommittedREAD UNCOMMITTEDDIRTY READ
Read committedREAD COMMITTEDCOMMITTED READ
未定义不可用COMMITTED READ LAST COMMITTED
未定义不可用CURSOR STABILITY
Repeatable readREPEATABLE READREPEATABLE READ
SerializableSERIALIZABLEREPEATABLE READ

  SinoDB 动态服务器除了支持ANSI定义的隔离级别外还支持其他两个隔离级别:CURSOR STABILITY(特定于游标操作),COMMITTED READ LAST COMMITTED

2.2 隔离级别控制

SinoDB 动态服务器允许用户使用以下方法控制其查询的隔离级别:

  • SET TRANSACTION
    — 符合 ANSI 标准
    — 支持访问模式(access modes)
    — 每个事务可设置一次

  • SET ISOLATION
    — 不符合 ANSI 标准
    — 不支持访问模式
    — 可在事务中更改

  SinoDB 动态服务器提供两个SQL语句来控制应用程序中的当前隔离级别。第一个语句 SET TRANSACTION 符合ANSI SQL-92规范。第二个语句SET ISOLATION不符合ANSI标准,也不支持访问模式,但允许指定SinoDB特定的隔离级别:CURSOR STABILITY 与 COMMITTED READ LAST COMMITTED

  SET TRANSACTIONSET ISOLATION之间的主要区别是SET TRANSACTION语句只在事务持续时间内生效。此外,您只能在事务中执行一个SET TRANSACTION语句。

示例:
SET ISOLATION语句允许您更改单个事务中的有效隔离级别,例如:

BEGIN WORK;
SET ISOLATION TO DIRTY READ;
SELECT * FROM customer;
SET ISOLATION TO REPEATABLE READ;
INSERT INTO cust_info;

一旦使用SET ISOLATION语句设置隔离级别后,将一直保持有效到下一个SET ISOLATION语句或到会话结束。

2.3 访问方法

  • 默认情况下,动态服务器事务始终能够读写

  • 要控制访问模式,请使用以下语句:
    SET TRANSACTION READ WRITE;
    SET TRANSACTION READ ONLY;

  • 只读取事务无法:
    — 更新、插入或删除行
    — 添加、删除、更改或重命名数据库对象
    — 更新数据库统计表
    — 授予或撤销权限

ANSI SQL-92定义了读写和只读事务。

2.4 Read Uncommitted

ANSI:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

SinoDB:

SET ISOLATION TO DIRTY READ;

1694595385116

1694595385116849×284 23.3 KB

  当隔离级别是Read UncommittedDIRTY READ时,数据库服务器在解析查询时不会放置任何锁或检查现有的锁。在检索期间,您可以查看任何行,即使那些包含未提交的更改。

  DIRTY READ脏读取隔离使您的查询可以检索幻像行。

  幻像行是事务插入的行,但事务被回滚而不是提交。虽然幻像行从未提交到数据库,因此从不真正存在 于数据库中,但是对于使用脏读取隔离的任何进程都是可见的。

  DIRTY READ脏读取隔离是唯一可用于非日志记录数据库的隔离级别。

  在以下情况下,DIRTY READ脏读隔离非常有用::

  • 表是静态的
  • 100%的准确性不如速度和免于争用那么重要
  • 你不能等待释放锁

2.5 Read committed

ANSI:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

SinoDB:

SET ISOLATION TO COMMITTED READ;

1694596487154

1694596487154878×365 16.1 KB

  有日志记录的数据库中的查询默认为ANSI read-committed隔离。Read-committed隔离与SinoDB committed-read隔离是同义的。Read-committed隔离可确保读取的所有行都提交到数据库。要执行已提交的读取,数据库服务器将尝试 在读取之前获取行上的共享锁。它不放置锁,而是检查是否可以 获取锁。如果可以的话,可以保证该行存在并且在读取时不被其他进程更新。请记住不能在排它锁定的行上获取共享锁,在更新行时总是这样的情况。

  当您使用committed read扫描行时,您不会查看任何幻像行或脏数据。您知道当前行已提交(至少当您的进程读取它时已提交)。但是,在进程读取该行后,其他进程可以对其更改。

  在以下情况,committed read隔离非常有用:

  • 查找
  • 查询
  • 生成常规信息的报表

2.6 Cursor Stability

SET ISOLATION TO CURSOR STABILITY;

  使用CURSOR STABILITY,游标读取共享锁时在每一行上都会获取共享锁。这个共享锁一直保持到下一行被检索。如果使用游标检索数据,那么共享锁一直保持到执行下一个FETCH。

  在这个级别上,您不仅可以查看提交的行,还可以确保在查看时该行会继续存在。没有其他进程(UPDATE或DELETE)可以在您查看时更改该行。

  您可以使用CURSOR STABILITY隔离级别的SELECT语句:

  • 查找
  • 查询
  • 产生操作数据的报告

  如果设置了CURSOR STABILITY的隔离级别,并且未使用游标,则CURSOR STABILITY的行为方式与READ COMMITTED(从未实际设置共享锁)相同。

2.7 Repeatable Read 和 Serializable Read

ANSI:

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

SinoDB:

SET ISOLATION TO REPEATABLE READ;

1694597994164

1694597994164855×395 17.5 KB

  在SinoDB数据库中,Repeatable ReadSerializable Read是一样的。Repeatable ReadSerializable Read隔离级别将共享锁放在数据库服务器检查的所有行上; 所有这些锁都一直保持到提交事务。其他用户可以读取数据,但不能以任何方式修改数据。该行将不仅在您查看时继续存在,而且之后在同一事务中重新读取时也将继续存在。

  SinoDB动态服务器创建MODE ANSI数据库时使用的默认隔离级别是REPEATABLE READ

  当您必须将所有行读取为一个单位或您需要保证值不变时,Repeatable Read是有用的。例如:

  • 关键,聚合计算(如在账户余额中)
  • 从多个表中的联合查询(如在预定系统中)

   REPEATABLE READ保证了数据集在事务期间的一致性。为此,它不仅必须锁定满足查询筛选条件的行,还必须锁定为解析查询而必须读取的任何行和索引键。如果查询执行顺序扫描而不是索引读取,数据库服务器将通过将所需的页锁或行锁替换为表上的单个共享锁来优化扫描。

2.8 COMMITTED READ LAST COMMITTED

SET ISOLATION TO COMMITTED READ LAST COMMITTED;

1694598104107

1694598104107717×317 28.2 KB

  使用“COMMITTED READ LAST COMMITTED” 隔离级别,可以缓解等待其他用户释放锁的问题,以及在不一致状态(在事务过程中)下检索数据的风险。

  当设置了“COMMITTED READ LAST COMMITTED”隔离级别并且另一个进程对数据持有独占行锁时,返回给用户的数据是上次提交时存在的数据。

  此隔离级别也缓解了死锁问题,因为即使设置了锁,用户也会在上次提交时获取数据,而不必等待其他用户持有的锁被释放。

示例

1694598532481

16945985324811001×455 40 KB

  user1 正在修改user2 想要的行的事务中。在“COMMITTED READ LAST COMMITTED” 隔离级别下,不是等待锁被释放或检索“脏”数据,而是把 c2 上次提交的值将返回给user2,确保数据有效且未被更改。

2.8.1 配置 LAST COMMITTED

使用参数进行设置:

  • USELASTCOMMITTED:
    — 在ONCONFIG配置文件中进行设置,对所有会话有效,可以使用onmode -wf 或者onmode -wm进行动态设置。
    — 通过环境变量进行设置,会覆盖配置参数设置的值。

使用SQL 语句进行设置::

SET ISOLATION TO COMMITTED READ LAST COMMITTED;
SET ENVIRONMENT USELASTCOMMITTED ‘ALL|COMMITTEDREAD|DIRTY READ|NONE’;

  SET ISOLATION TO COMMITTED READ LAST COMMITTED ;会覆盖环境变量的设置值。
  SET ENVIRONMENT USELASTCOMMITTED;这会话级语句确定当操作遇到锁并且会话隔离级别设置为COMMITTED READ或者DIRTY READ时执行的操作。

设置值说明如下:

  • COMMITTED READ
      数据库服务器在尝试读取Committed Read 或 Read Committed隔离级别中的行时遇到独占锁时,将读取最近提交的数据版本。

  • DIRTY READ
      数据库服务器在尝试读取Dirty Read 或 Read Committed隔离级别中的行时遇到独占锁时,将读取最近提交的数据版本。

  • ALL
      数据库服务器在尝试读取Committed ReadDirty ReadRead CommittedRead Uncommitted隔离级别中的行时遇到独占锁时,将读取最近提交的数据版本。

  • NONE
      禁用 USELASTCOMMIT 功能。在此设置下,如果会话在尝试读取Committed ReadDirty ReadRead CommittedRead Uncommitted隔离级别中的行时遇到独占锁,则在提交或回滚持有独占锁的并发事务之前,将不允许事务读取该行。

  使用 COMMITTED READ LAST COMMITTED隔离级别可以降低当两个或多个会话尝试使用行锁访问表中同一行时锁定冲突的风险,从而提高使用Committed Read, Dirty Read, Read Committed或者Read Uncommitted隔离级别的会话中的并发性。

  任何 SPL 例程都可以使用SQL语句在会话期间指定 COMMITTED READ LAST COMMITTED事务隔离级别。这些语句使得 SQL 操作在读取行遇到独占锁时读取上次提交的版本。

  在跨服务器分布式查询中,如果发出查询的会话使用 COMMITTED READ LAST COMMITTED隔离级别,但有一个或多个参与的数据库不支持此“ LAST COMMITTED”功能,则整个事务符合发起事务的会话的Committed Read或者Dirty Read隔离级别, 而不使用COMMITTED READ LAST COMMITTED隔离级别。

2.8.2 使用LAST COMMITTED注意事项

  • 支持:
    – B-tree索引
    – 函数索引

  • 不支持:
    – R-tree索引
    – 通过DataBlade模块访问表
    – 包含collection数据类型列的表
    – 使用虚拟表接口 (VTI) 创建的表
    – 具有页级锁或独占锁的表
    – 无日志表或数据库
     

更多信息内容请移步星瑞格官方社区,期待大家加入
Sinoregal Tech Forumicon-default.png?t=N7T8https://forum.sinoregal.cn/ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/24850.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

独立游戏之路 -- 获取OAID提升广告收益

Unity 之 获取手机:OAID、IMEI、ClientId、GUID 前言一、Oaid 介绍1.1 Oaid 说明1.2 移动安全联盟(MSA) 二、站在巨人的肩膀上2.1 本文实现参考2.2 本文实现效果2.3 本文相关插件 三、Unity 中获取Oaid3.1 查看实现源码3.2 工程配置3.3 代码实现3.4 场景搭建 四、总…

6.6SSH的运用

ssh远程管理 ssh是一种安全通道协议,用来实现字符界面的远程登录。远程复制,远程文本传输。 ssh对通信双方的数据进行了加密 用户名和密码登录 密钥对认证方式(可以实现免密登录) ssh 22 网络层 传输层 数据传输的过程中是加密的 …

【一百零五】【算法分析与设计】分解质因数,952. 按公因数计算最大组件大小,204. 计数质数,分解质因数,埃式筛

分解质因数 题目&#xff1a;分解质因数 题目描述 给定一个正整数 n&#xff0c;编写一个程序将其分解为质因数&#xff0c;并按从小到大的顺序输出这些质因数。 输入格式 一个正整数 n&#xff0c;其中 n 的范围是 1 < n < 10^18。 输出格式 按从小到大的顺序输出 n 的质…

【Oracle生产运维】表空间可用性告警排查处理

1 前言 在生产环境中&#xff0c;一般设置表空间告警阈值是90%&#xff0c;在接到监控报警后&#xff0c;并不是需要立刻对表空间进行扩容。 决定是否扩容主要看表空间最近的增量是多少&#xff0c;假如剩余10%的空间还能支持1个月的增量&#xff0c;那就不需要急着扩容。如果…

linux经典例题编程

编写Shell脚本&#xff0c;计算1~100的和 首先vi 1.sh,创建一个名为1.sh的脚本&#xff0c;然后赋予这个脚本权限&#xff0c;使用命令chmod 755 1.sh&#xff0c;然后就可以在脚本中写程序&#xff0c;然后运行。 shell脚本内容 运行结果&#xff1a; 编写Shell脚本&#xf…

C++的封装(十二):外部构造函数

通常&#xff0c;C创建一个对象&#xff0c;都是调用构造函数对它初始化&#xff1a; class AB {int a;int b; public:AB(int ia, int ib) {aia; bib;}void display() {printf("a%d, b%d\n", a, b);}void other(); };如果实现过程需要施加更多的控制&#xff0c;比如…

自动化测试实战:如何构建高效且可靠的测试框架

随着软件行业的快速发展&#xff0c;自动化测试已成为确保软件质量不可或缺的环节。作为一名资深自动化测试工程师&#xff0c;我将分享如何构建一个高效且可靠的自动化测试框架&#xff0c;以提升测试效率&#xff0c;降低人工成本&#xff0c;并确保软件产品的稳定性。 一、…

软考-架构设计师-综合知识总结(试卷:2009~2022)(上篇)

说明 本文档对2009到2022年试卷的综合知识进行了归纳总结&#xff0c;同时对叶宏主编的《系统架构设计师教程》划分重点。 第一章&#xff1a;关于架构、架构师概述 1.1 重要知识点&#xff1a; 模块化开发规则&#xff1a; 1> 最高模块内聚&#xff0c;即在一个模块内部的…

一千题,No.0049(跟奥巴马一起编程)

美国总统奥巴马不仅呼吁所有人都学习编程&#xff0c;甚至以身作则编写代码&#xff0c;成为美国历史上首位编写计算机代码的总统。2014 年底&#xff0c;为庆祝“计算机科学教育周”正式启动&#xff0c;奥巴马编写了很简单的计算机代码&#xff1a;在屏幕上画一个正方形。现在…

开发指南028-生成二维码

平台通过zxing来生成二维码 <dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.3.3</version> </dependency> <dependency><groupId>com.google.zxing</groupId>&l…

分享一个 .NET Core Console 项目使用依赖注入的详细例子

前言 依赖注入&#xff08;Dependency Injection&#xff0c;简称DI&#xff09;是一种软件设计模式&#xff0c;主要用于管理和组织一个软件系统中不同模块之间的依赖关系。 在依赖注入中&#xff0c;依赖项&#xff08;也称为组件或服务&#xff09;不是在代码内部创建或查…

【浏览器插件】理解浏览器扩展开发:为什么 `content script` 里的 `window` 与页面的 `window` 不同以及解决方案

理解浏览器扩展开发&#xff1a;为什么 content script 里的 window 与页面的 window 不同以及解决方案 浏览器扩展开发为开发者提供了强大的工具&#xff0c;使得我们可以扩展和增强网页的功能。然而&#xff0c;在开发过程中&#xff0c;尤其是当涉及到与网页内容进行交互时…

Android基础-事件分发机制

在Android系统中&#xff0c;事件分发机制是处理用户交互事件的核心机制。当用户与设备进行交互&#xff0c;如点击、滑动屏幕时&#xff0c;这些动作会被系统捕获并转化为相应的事件&#xff08;如MotionEvent&#xff09;&#xff0c;随后这些事件需要通过一系列的处理和传递…

Redux实现状态管理

在使用 Redux 的应用中&#xff0c;实现状态管理通常涉及以下几个步骤&#xff1a; 创建 Action&#xff1a;Action 是一个简单的 JavaScript 对象&#xff0c;它描述了一个行为&#xff0c;通常有一个 type 字段来表示行为类型。 创建 Reducer&#xff1a;Reducer 是一个纯函…

C# WPF入门学习主线篇(十二)—— Canvas布局容器

欢迎来到C# WPF入门学习系列的第十二篇。在之前的文章中&#xff0c;我们介绍了WPF布局管理的基本概念以及常见的布局容器。本篇博客将详细介绍其中一种最基本的布局容器——Canvas布局容器。通过本篇文章&#xff0c;您将学习如何使用Canvas布局容器来精确控制子控件的位置&am…

二叉树的算法题目

二叉树的遍历题目 二叉树遍历一般包含三种分别为&#xff1a;根左右、左根右、左右根&#xff08;又称为前序遍历、中序遍历、后序遍历&#xff09; 方法一&#xff1a;使用递归遍历 方法二&#xff1a;使用迭代使用栈 我们以左根右&#xff08;中序遍历&…

【SpringBoot】项目搭建基本步骤(整合 Mybatis)

搭建 SpringBoot 项目有两种方式&#xff1a;使用 IDEA、或者在 Spring 官网下载。 1. IDEA 创建 打开 IDEA 后&#xff0c;英文版请点击 File -> New -> Project -> Spring Initialer。 中文版请点击 文件 -> 新建 -> 项目 -> Spring Initialer。 在打开的…

【Proteus8.16】Proteus8.16.SP3.exe的安装包,安装方法

下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/14ZlETF7g4Owh8djLaHwBOw?pwd2bo3 提取码&#xff1a;2bo3 管理员打开proteus8.16.SP3.exe一路装就行了&#xff0c;许可证选Licence2.lxk,点安装后关闭&#xff0c;然后继续装完。 然后打开Patch-Proteus-8.16-…

力扣2972.统计移除递增子数组的数目 II

力扣2972.统计移除递增子数组的数目 II 类似1574. 核心都是定一边最大能取到的位置定一边 移一边当我们确定左右端点位置时 [i1,j]是一定要删除的然后i 1这里可以一直缩小到0也就是总共 i 2个子数组 class Solution {public:long long incremovableSubarrayCount(vector&l…

【Ardiuno】ESP32单片机初试点亮LED小灯

之前用的Ardiuno的主板做过一些简单的开发实验&#xff0c;按照相关说明还是很容易进行操作的。最近看了ESP32可以有wifi的功能&#xff0c;也就买来实验一下。 ESP32的主板开发环境安装&#xff0c;按照说明的安装下载程序总是报错&#xff0c;又上网搜索半天最后按照CSDN上某…