2023-09-22 monetdb-事务管理-乐观并发控制-记录

news/2024/12/29 9:23:40/

摘要:

2023-09-22 monetdb-事务管理-记录

相关文档:

Transaction Management | MonetDB Docs

https://en.wikipedia.org/wiki/Optimistic_concurrency_control

monetdb事务管理:

MonetDB/SQL 支持以 START TRANSACTION 标记并以 COMMIT 或 ROLLBACK 关闭的多语句事务方案。如果每个 SQL 语句应被视为独立事务,则可以将会话变量 AUTOCOMMIT 设置为 true(默认)。

在AUTOCOMMIT模式下,可以使用START TRANSACTION和COMMIT/ROLLBACK来指示包含多个SQL语句的事务。在这种情况下,AUTOCOMMIT 由 START TRANSACTION 自动禁用,并由 COMMIT 或 ROLLBACK 重新启用。

如果 AUTOCOMMIT 模式为 OFF,则 START TRANSACTION 是隐式的,您应该只使用 COMMIT/ROLLBACK。

警告:事务管理方案基于乐观并发控制。它为每个事务提供了数据库的一致视图,但更新被收集在事务提交时处理的附录中。如果在提交时可以确保准备更新影响表的数据同时没有更改,则结果将被合并。否则交易将中止。这种乐观并发方案对于查询主导环境特别有用。它会对长时间运行的事务产生负面影响,这些事务同时受到其基础表更新的影响。对于尝试从单个应用程序中的多个线程执行并发更新的应用程序也是如此。它们应该由应用程序在内部序列化,以避免意外的事务中止。

乐观并发控制可能会让那些构建在线事务应用程序的人感到困惑,因为并发控制方案的粒度将显示比预期更高的事务失败。没有锁定模式可以避免这种情况。应用程序可能必须诉诸串行执行。

被删除的元组仅被标记为这样。它们不会减小表的大小。您甚至会在多次更新后遇到查询运行速度变慢的情况,因为每个查询首先必须通过检查删除/更新列表在数据库上建立一致的私有视图。它需要在后台使用真空清洁算法,但目前尚不可用。

使用可选的事务模式或隔离级别启动事务和本地事务(关闭自动提交)。

SET TRANSACTION
| SET_LOCAL_TRANSACTION[ READ ONLY | READ WRITE | ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } |DIAGNOSTICS _sqlSize_ ]

使用可选的事务模式或隔离级别启动本地事务(关闭自动提交)

 | { START | BEGIN } TRANSACTION[ READ ONLY | READ WRITE | ISOLATION LEVEL { READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE } | DIAGNOSTICS _sqlSize_ ]</pre>

禁用自动提交并启动用户控制的事务

注意:事务还可以包含数据定义 (DDL) 命令,例如 CREATE、ALTER、DROP。

 | COMMIT [ WORK ] [ AND [ NO ] CHAIN ]| ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ]| SAVEPOINT savepoint_id_name| ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ] TO SAVEPOINT savepoint_id_name| RELEASE SAVEPOINT savepoint_id_name

您需要先启动一个事务,然后才能使用保存点 使自事务启动以来完成的所有更改持久化

例子
SET TRANSACTION;
ROLLBACK;
SET TRANSACTION READ ONLY;
ROLLBACK;
SET TRANSACTION READ WRITE;
ROLLBACK;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
ROLLBACK;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ROLLBACK;
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
ROLLBACK;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
ROLLBACK;

乐观并发控制

乐观并发控制OCC)也称为乐观锁定,是一种应用于关系数据库管理系统、软件事务内存等事务系统的并发控制方法。OCC 假设多个交易可以频繁完成而不会相互干扰。运行时,事务使用数据资源而不获取这些资源的锁。在提交之前,每个事务都会验证没有其他事务修改了它所读取的数据。如果检查发现冲突的修改,则提交事务将回滚并可以重新启动。[1]乐观并发控制由HT Kung和 John T. Robinson于 1979 年首次提出。[2]

OCC 一般用于数据争用较少的环境。当冲突很少时,事务可以完成,而无需管理锁的费用,也无需事务等待其他事务的锁清除,从而比其他并发控制方法具有更高的吞吐量。然而,如果数据资源的争用频繁,则重复重新启动事务的成本会显着损害性能,在这种情况下,其他并发控制方法可能更适合。然而,基于锁定(“悲观”)的方法也会带来较差的性能,因为即使避免了死锁,锁定也会极大地限制有效并发性。

乐观并发控制的阶段[编辑]

乐观并发控制事务涉及以下阶段:[2]

  • Begin:记录标记事务开始的时间戳。
  • 修改:读取数据库值,并暂时写入更改。
  • Validate:检查其他事务是否修改了本事务已使用(读或写)的数据。这包括在此事务开始时间之后完成的事务,以及(可选)在验证时仍处于活动状态的事务。
  • Commit/Rollback:如果没有冲突,则使所有更改生效。如果存在冲突,通常通过中止事务来解决它,尽管其他解决方案也是可能的。必须小心避免检查时间到使用时间错误,特别是如果此阶段和前一阶段不是作为单个原子操作执行的。

例子[编辑]

  • MediaWiki的编辑页面使用 OCC。[4]
  • Bugzilla使用 OCC;编辑冲突称为“空中冲突”。[5]
  • Ruby on Rails框架有一个用于 OCC 的 API。[6]
  • Grails框架在其默认约定中使用 OCC 。[7]
  • GT.M数据库引擎使用 OCC 来管理事务[8](甚至单个更新也被视为小型事务)。
  • Microsoft的实体框架(包括 Code-First)内置了对基于二进制时间戳值的 OCC 的支持。[9]
  • Mimer SQL是一种仅实现乐观并发控制的DBMS 。[10]
  • Google App Engine数据存储使用 OCC。[11]
  • Apache Solr搜索引擎通过 _version_ 字段支持 OCC。[12]
  • Elasticsearch搜索引擎通过版本属性支持 OCC 。[13]
  • CouchDB通过文档修订的方式实现OCC。[14]
  • MonetDB面向列的数据库管理系统的事务管理 方案是基于OCC的。[15]
  • 大多数软件事务内存的实现都使用 OCC。[需要引用]
  • Redis通过WATCH命令提供OCC。[16]
  • Firebird使用多代架构作为 OCC 的数据管理实现。[需要引用]
  • DynamoDB使用条件更新作为 OCC 的实现。[17]
  • Kubernetes在更新资源时使用 OCC。[18]
  • YugabyteDB是一个主要使用OCC的云原生数据库。[19]
  • Firestore是Firebase的 NoSQL 数据库,在其事务中使用 OCC。

http://www.ppmy.cn/news/1121016.html

相关文章

亚马逊云科技面向 macOS 的 Amazon 云服务器 EC2 M1 Mac 实例

北京 ——2022 年 8 月 10 日&#xff0c;日前&#xff0c;亚马逊云科技宣布基于 Apple 芯片 Mac mini 计算机构建的 Amazon Elastic Compute Cloud (Amazon EC2) M1 Mac 实例正式可用。该实例由亚马逊云科技 Nitro 系统提供支持&#xff0c;与基于 x86 的 Amazon EC2 Mac 实例…

重写和重载、抽象类和接口

文章目录 前言一、重载与重写1.重载&#xff08;Overload&#xff09;&#xff08;1&#xff09;条件&#xff08;2&#xff09;举例 2.重写&#xff08;Override)&#xff08;1&#xff09;规则&#xff08;2&#xff09;举例 3.重载和重写区别 二、抽象类与接口1.抽象类&…

LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略

LLMs之InternLM&#xff1a;InternLM-20B的简介、安装、使用方法之详细攻略 导读&#xff1a;2023年09月20日&#xff0c;由上海人工智能实验室等团队发布了InternLM-20B的大模型。它在OpenCompass提出的5个能力维度上(语言、知识、理解、推理、学科)全面领先于同规模开源模型&…

深度学习自学笔记三:向量化逻辑回归和Python中的广播

目录 一、向量化 二&#xff1a;向量化逻辑回归 三、Python中的广播 一、向量化 向量化&#xff08;Vectorization&#xff09;是一种优化技术&#xff0c;可以在机器学习和数值计算中加快代码的执行速度。它的核心思想是使用矩阵和向量运算&#xff0c;而不是显式地循环处…

Wiki.js - 下一代的开源Wiki软件

简介&#xff1a;在众多开源的Wiki软件中&#xff0c;Wiki.js无疑是一个独特且现代的选择。基于Node.js构建&#xff0c;使用了最新的Web技术&#xff0c;Wiki.js为用户提供了一个美观且功能丰富的界面&#xff0c;同时还保留了强大的扩展性和自定义性。无论你是为个人、团队或…

mysqld_exporter监控MySQL服务

一、MySQL授权 1、登录MySQL服务器对监控使用的账号授权 CREATE USER exporterlocalhost IDENTIFIED BY 123456 WITH MAX_USER_CONNECTIONS 3; GRANT PROCESS, REPLICATION CLIENT, SELECT ON *.* TO exporterlocalhost; flush privileges;2、上传mysqld_exporter安装包&#…

Idea和DataGrip自定义常用代码模板,熟练使用快捷模板可促进开发效率

场景&#xff1a; 在实际工作中&#xff0c;我们不可能一个一个字母的去敲代码&#xff0c;为了提升开发效率&#xff0c;可以使用常用的快捷代码模板。idea和datagrip自带的有&#xff0c;我们也可以自定义快捷模板 一、Idea自定义代码模板、有些是基于 hutool 常用包 1、-&g…

VS2019的SDL2项目配置

库下载 Simple DirectMedia Layer - Homepage 对于Windows下使用VS2019开发的选手&#xff0c;应该直接选VC后缀了。 VS目录配置 首先VS2019创建一个空项目&#xff0c;新加入一个源文件&#xff0c;代码如下&#xff1a; /*This source code copyrighted by Lazy Foo Produ…