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 的质…

linux经典例题编程

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

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

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

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

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

二叉树的算法题目

二叉树的遍历题目 二叉树遍历一般包含三种分别为&#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-…

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

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

平衡二叉树详解

目录 平衡二叉树的定义 平衡二叉树的基本操作 查找 插入 AVL树的建立 平衡二叉树的定义 平衡二叉树仍然是一棵二叉查找树&#xff0c;只是在其基础上增加了平衡的要求&#xff0c;也就是其左右子树的高度之差的绝对值不超过1。 在定义树的结构时需要加入一个变量height&…

uc_os操作练习

目录 一、CubeMX配置 二、获取uc-os源码 三、代码移植 四、代码修改 五、总结 六、参考资料 一、CubeMX配置 首先进入CubeMX&#xff0c;&#xff0c;新建工程&#xff0c;选择STM32F103C8T6芯片&#xff0c;照例配置好RCC和SYS。 然后配置GPIO输出&#xff0c;这里选择P…

2024 年最新 Python 基于百度智能云实现文字识别 OCR 详细教程

文字识别 OCR 概述 文字识别OCR&#xff08;Optical Character Recognition&#xff09;提供多场景、多语种、高精度的文字检测与识别服务&#xff0c;多项ICDAR指标居世界第一。广泛适用于金融服务、财税报销、法律政务、保险医疗、快递物流、交通出行、教育培训等场景&#…

C++ 11 【线程库】【包装器】

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;C修炼之路⏪   &#x1f69a;代码仓库:C高阶&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多C知识   &#x1f51d;&#x1f51d; 目录 前言 一、thread类的简单介绍 get_id…

BeagleBone Black入门总结

文章目录 参考连接重要路径系统镜像下载访问 BeagleBone 参考连接 镜像下载启动系统制作&#xff1a;SD卡烧录工具入门书籍推荐&#xff1a;BeagleBone cookbookBeagleBone概况&#xff1f; 重要路径 官方例程及脚本路径&#xff1a;/var/lib/cloud9 系统镜像下载 疑问&am…

C 语言实现在终端里输出二维码

Mac 环境安装二维码库 brew install qrencode安装过程报权限问题执行以下命令 sudo chown -R 用户名 /usr/local/include /usr/local/lib chmod uw /usr/local/include /usr/local/lib#include <stdio.h> #include <qrencode.h>void print_qr_code(QRcode *qrcode…

SpringBoot+Vue图书管理系统(前后端分离)

技术栈 JavaSpringBootMavenMySQLMyBatisVueShiroElement-UI 角色对应功能 用户管理员 功能截图

人工智能在交通与物流领域的普及及应用

文章目录 &#x1f40b;引言 &#x1f40b;自动驾驶 &#x1f988;自动驾驶汽车 &#x1f421;应用现状 &#x1f421;技术实现 &#x1f421;实现过程及代码 &#x1f40b;智能交通管理 &#x1f988;应用现状 &#x1f988;技术实现 &#x1f988;实现过程及代码 &…

老黄一举揭秘三代GPU!打破摩尔定律,打造AI帝国,量产Blackwell解决ChatGPT全球耗电难题

近日&#xff0c;老黄手持Blackwell向全世界展示的那一刻&#xff0c;全场观众沸腾了。 这是迄今为止世界上最大的芯片&#xff01; 用老黄的话来说&#xff0c;它是「全世界迄今为止制造出来的最复杂、性能最高的计算机。」GPT-4o深夜发布&#xff01;Plus免费可用&#xff01…

结构体(1)<C语言>

导言 结构体是C语言中的一种自定义类型&#xff0c;它的值&#xff08;成员变量&#xff09;可以是多个&#xff0c;且这些值可以为不同类型&#xff0c;这也是和数组的主要区别&#xff0c;下面将介绍它的一些基本用法&#xff0c;包括&#xff1a;结构体的创建、结构体变量的…