数据库管理-第201期 优先级事务-01(20240611)

2024-06-11 17:52

本文主要是介绍数据库管理-第201期 优先级事务-01(20240611),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

数据库管理201期 2024-06-11

  • 数据库管理-第201期 优先级事务-01(20240611)
    • 1 概念
    • 2 使用优先级事务
      • 2.1 配置会话优先级
      • 2.2 配置系统级别等待目标
    • 2.3 确认自动回滚
      • 2.4 配置优先级事务模式
      • 2.5 使用优先级事务模式确定系统级等待目标
    • 总结

数据库管理-第201期 优先级事务-01(20240611)

作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database(Oracle与MySQL)
PostgreSQL ACE Partner
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、认证技术专家、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问、OceanBase观察团成员,青学会(青年数据库学习互助会)外部顾问
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭

好几期没写技术了,作为技术博主这是不合格的,这一期回归Oracle Database 23ai的一个新特性Priority Transactions。

1 概念

当会话使用INSERT、UPDATA、MERGE或SELECT…FOR UPDATE来修改数据时,就会对需要修改的数据对应的行保持一个行锁来避免其他会话对这些数据进行修改,避免数据错误操作。这个锁会维持到提交(commit)或者回滚(rollback)。在某些情况下,事务可以长时间保持行锁。例如,应用程序修改了一些行,但由于应用程序中的异常而不提交或终止事务。传统上,当一个事务在行锁上被另一个事务长时间阻塞时,它需要数据库管理员使用ALTER SYSTEM KILL SESSION命令手动终止阻塞事务。
从Oracle Database 23ai开始,Oracle数据库提供了一个参数来控制何时将哪些保持行锁的事务自动回滚。数据库会回滚这些事务,但是会话依然存活,应用程序必须通过发出rollback SQL语句来确认事务的自动回滚。这个功能就叫做Priority Transactions,优先级事务。
应用程序可以指定其事务的优先级。如果低优先级事务的行锁阻止了高优先级事务,Oracle数据库将自动回滚低优先级事务,以使高优先级事务继续进行。数据库管理员可以配置回滚低优先级事务的时间。
但是当低优先级事务未阻塞任何其他会话时,这个会话永远不会被回滚。

2 使用优先级事务

2.1 配置会话优先级

可以使用下面的ALTER SESSION语句来配置会话的优先级:

ALTER SESSION SET "txn_priority" = "HIGH";

txn_priority可设置为LOW, MEDIUM和HIGH。所有的会话默认优先级都为HIGH,所以默认情况下没有会话会被自动回滚。如果在事务启动后修改此参数,则不会动态更改当前事务的优先级。会话中创建的下一个事务将使用更新后的优先级。
如果为行锁阻止了高优先级(HIGH)事务,则只有当持有者为低优先级(LOW)或中优先级(MEDIUM)时,Oracle数据库才能回滚持有行锁的事务。Oracle永远不会回滚高优先级(HIGH)事务。
如果一个中优先级(MEDIUM)的事务因行锁而被阻止,则只有当持有者为低优先级(LOW)时,Oracle数据库才能回滚持有行锁的事务。
如果一个低(LOW)优先级事务因行锁而被阻止,Oracle数据库将不会尝试回滚持有该行锁的事务,无论其优先级如何。

2.2 配置系统级别等待目标

Oracle数据库提供了参数来控制阻塞多长时间后自动回滚持有锁的会话:PRIORITY_TXNS_HIGH_WAIT_TARGET和PRIORITY_TXNS_MEDIUM_WAIT_TARGET,以秒为单位设置最长持续时间,即优先级为HIGH和MEDIUM的事务将在数据库回滚持有行锁的优先级较低的事务之前的等待时间。阻止程序事务被回滚,但其相应的会话不会被终止并保持活动状态。应用程序必须通过捕获ORA-63300并发出rollback SQL语句来确认此自动回滚。如果没有发出ROLLBACK,那么会话中的所有SQL语句将继续接收ORA-63302。并没有提供低优先级的等待目标参数,因为阻塞会话的优先级为low,Oracle数据库不会回滚阻塞程序事务。

ALTER SYSTEM SET priority_txns_high_wait_target = 15;
ALTER SYSTEM SET priority_txns_medium_wait_target = 15;

当优先级较高的事务被优先级较低的事务阻塞时,系统至少等待指定的时间,然后再回滚阻塞的事务。当有多个被素色的事务试图获取同一行锁时,等待时间可能比指定的目标时间长。例如,假设默认的高优先级等待目标设置为20秒。采取以下行动:

  1. 在时间t1,事务1,一个低优先级事务,锁定特定行。
  2. 10秒后的时间t2,事务2,一个低优先级事务,试图锁定同一行并等待。
  3. 5秒钟后的时间t3,事务3,一个高优先级事务,试图更新同一行。

假设没有事务执行提交,则高优先级事务从时间t3开始等待至少20秒,之后第一个事务被回滚。在此之后,事务2获得行锁,因为它在事务3之前请求了行锁。因此,从事务2获得行锁起,事务3将再等待20秒,之后事务2将回滚。因此,等待目标参数值并不意味着高优先级会话在获得行锁之前等待的最长时间。

2.3 确认自动回滚

事务的自动回滚必须得到确认,然后其会话才能继续执行进一步的SQL。可以通过发出事务回滚来提供确认。
当事务自动回滚时,活动会话中当前正在执行的SQL或空闲会话中的下一条SQL语句将获得ORA-63300。随后的SQL语句将抛出ORA-63302,直到发出回滚为止。因此,应用程序逻辑的结构必须捕获两个错误ORA-63300和ORA-63302,然后发出回滚。
下表列出了确认回滚的可用方法:
image.png

2.4 配置优先级事务模式

优先级事务支持两种模式,可以在启用此功能之前进行尝试。
优先级事务的默认模式是ROLLBACK。在此模式中,如果PRIORITY_TXNS_HIGH_WAIT_TARGET和PRIORITY_TXNS_MEDIUM_WAIT_ARGET配置得当,则持有行锁并阻止较高优先级事务的事务将自动回滚,并允许较高优先级的等待事务继续执行。
TRACK模式的目的是让数据库管理员试用优先级事务功能。在TRACK模式下,数据库将递增V$SYSSTAT中的统计信息(在2.2中展示的),反映此功能将回滚的事务数,而不是实际回滚任何事务。应用程序可以使用此模式在切换到ROLLBACK模式之前调整正确的等待目标值。
要将优先级事务模式设置为TRACK,请使用以下命令:

ALTER SYSTEM SET "priority_txns_mode"="TRACK";
-- 恢复为ROLLBACK模式
ALTER SYSTEM SET "priority_txns_mode"="ROLLBACK";

2.5 使用优先级事务模式确定系统级等待目标

优先级事务模式可用于帮助确定系统级等待目标。
为了帮助设置PRIORITY_TXNS_HIGH_WAIT_TARGET和PRIORITY_TXNS_MEDIUM_WAIT_ARGET到适当值,可以将PRIORITY-TXNS_MODE设置为TRACK并监视行锁定争用等待事件时间。
在TRACK模式下运行您的常规工作负载几个小时(或任何适当的时间),并监视特定优先级的时间事务,通常等待行锁定。例如,如果您观察到您的高优先级事务通常在行锁上等待最多10秒,则建议将PRIORITY_TXNS_HIGH_WAIT_TARGET的值设置为90秒以上的值,以便Oracle数据库在对数据库优先级会话的操作时不会回滚任何持有行锁的正常事务。确定这些参数的适当值后,可以关闭TRACK模式并切换到ROLLBACK模式,使用这些值配置系统级等待目标参数,然后开始使用优先级事务。
当存在对行锁的争用时,等待行锁的事务会等待一个常见的等待事件enq: TX - row lock contention。通过设置事务的txn_priority参数和系统的wait_target参数来启用优先级事务,等待事务将根据等待事务的优先级等待等待事件。
image.png
可以通过以下语句查询优先级会话信息:

SQL> SELECT TO_CHAR(xidusn) || '.' || TO_CHAR(xidslot) || '.' || TO_CHAR(xidsqn) AS transaction_id, sid, event, seconds_in_wait, blocking_sessionFROM   v$session, v$transactionWHERE  event LIKE '%enq%' AND v$session.saddr = v$transaction.ses_addr;TRANSACTION_ID  SID     EVENT                              SECONDS_IN_WAIT BLOCKING_SESSION
--------------- ------ ----------------------------------- --------------- ----------------
2.17.1619          187 enq: TX - row lock (HIGH priority)              361              204
5.32.1557           51 enq: TX - row lock (LOW priority)               359              204

总结

今天简单介绍了Priority Transactions,优先级事务,后面将进一步深入讲解该特性的其他内容并实战演示。
老规矩,知道写了些啥。

这篇关于数据库管理-第201期 优先级事务-01(20240611)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1051874

相关文章

HTML5中的Microdata与历史记录管理详解

《HTML5中的Microdata与历史记录管理详解》Microdata作为HTML5新增的一个特性,它允许开发者在HTML文档中添加更多的语义信息,以便于搜索引擎和浏览器更好地理解页面内容,本文将探... 目录html5中的Mijscrodata与历史记录管理背景简介html5中的Microdata使用M

Spring 基于XML配置 bean管理 Bean-IOC的方法

《Spring基于XML配置bean管理Bean-IOC的方法》:本文主要介绍Spring基于XML配置bean管理Bean-IOC的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录一. spring学习的核心内容二. 基于 XML 配置 bean1. 通过类型来获取 bean2. 通过

数据库面试必备之MySQL中的乐观锁与悲观锁

《数据库面试必备之MySQL中的乐观锁与悲观锁》:本文主要介绍数据库面试必备之MySQL中乐观锁与悲观锁的相关资料,乐观锁适用于读多写少的场景,通过版本号检查避免冲突,而悲观锁适用于写多读少且对数... 目录一、引言二、乐观锁(一)原理(二)应用场景(三)示例代码三、悲观锁(一)原理(二)应用场景(三)示例

Node.js 数据库 CRUD 项目示例详解(完美解决方案)

《Node.js数据库CRUD项目示例详解(完美解决方案)》:本文主要介绍Node.js数据库CRUD项目示例详解(完美解决方案),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考... 目录项目结构1. 初始化项目2. 配置数据库连接 (config/db.js)3. 创建模型 (models/

python uv包管理小结

《pythonuv包管理小结》uv是一个高性能的Python包管理工具,它不仅能够高效地处理包管理和依赖解析,还提供了对Python版本管理的支持,本文主要介绍了pythonuv包管理小结,具有一... 目录安装 uv使用 uv 管理 python 版本安装指定版本的 Python查看已安装的 Python

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

基于Python和MoviePy实现照片管理和视频合成工具

《基于Python和MoviePy实现照片管理和视频合成工具》在这篇博客中,我们将详细剖析一个基于Python的图形界面应用程序,该程序使用wxPython构建用户界面,并结合MoviePy、Pill... 目录引言项目概述代码结构分析1. 导入和依赖2. 主类:PhotoManager初始化方法:__in

Spring Security基于数据库的ABAC属性权限模型实战开发教程

《SpringSecurity基于数据库的ABAC属性权限模型实战开发教程》:本文主要介绍SpringSecurity基于数据库的ABAC属性权限模型实战开发教程,本文给大家介绍的非常详细,对大... 目录1. 前言2. 权限决策依据RBACABAC综合对比3. 数据库表结构说明4. 实战开始5. MyBA

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数