数据库管理-第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

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

SpringBoot中使用 ThreadLocal 进行多线程上下文管理及注意事项小结

《SpringBoot中使用ThreadLocal进行多线程上下文管理及注意事项小结》本文详细介绍了ThreadLocal的原理、使用场景和示例代码,并在SpringBoot中使用ThreadLo... 目录前言技术积累1.什么是 ThreadLocal2. ThreadLocal 的原理2.1 线程隔离2

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

MySQL数据库函数之JSON_EXTRACT示例代码

《MySQL数据库函数之JSON_EXTRACT示例代码》:本文主要介绍MySQL数据库函数之JSON_EXTRACT的相关资料,JSON_EXTRACT()函数用于从JSON文档中提取值,支持对... 目录前言基本语法路径表达式示例示例 1: 提取简单值示例 2: 提取嵌套值示例 3: 提取数组中的值注意

查询SQL Server数据库服务器IP地址的多种有效方法

《查询SQLServer数据库服务器IP地址的多种有效方法》作为数据库管理员或开发人员,了解如何查询SQLServer数据库服务器的IP地址是一项重要技能,本文将介绍几种简单而有效的方法,帮助你轻松... 目录使用T-SQL查询方法1:使用系统函数方法2:使用系统视图使用SQL Server Configu

SQL Server数据库迁移到MySQL的完整指南

《SQLServer数据库迁移到MySQL的完整指南》在企业应用开发中,数据库迁移是一个常见的需求,随着业务的发展,企业可能会从SQLServer转向MySQL,原因可能是成本、性能、跨平台兼容性等... 目录一、迁移前的准备工作1.1 确定迁移范围1.2 评估兼容性1.3 备份数据二、迁移工具的选择2.1

Python中连接不同数据库的方法总结

《Python中连接不同数据库的方法总结》在数据驱动的现代应用开发中,Python凭借其丰富的库和强大的生态系统,成为连接各种数据库的理想编程语言,下面我们就来看看如何使用Python实现连接常用的几... 目录一、连接mysql数据库二、连接PostgreSQL数据库三、连接SQLite数据库四、连接Mo

Linux之进程状态&&进程优先级详解

《Linux之进程状态&&进程优先级详解》文章介绍了操作系统中进程的状态,包括运行状态、阻塞状态和挂起状态,并详细解释了Linux下进程的具体状态及其管理,此外,文章还讨论了进程的优先级、查看和修改进... 目录一、操作系统的进程状态1.1运行状态1.2阻塞状态1.3挂起二、linux下具体的状态三、进程的

Oracle数据库如何切换登录用户(system和sys)

《Oracle数据库如何切换登录用户(system和sys)》文章介绍了如何使用SQL*Plus工具登录Oracle数据库的system用户,包括打开登录入口、输入用户名和口令、以及切换到sys用户的... 目录打开登录入口登录system用户总结打开登录入口win+R打开运行对话框,输php入:sqlp