Oracle数据库事务的开启与结束详解


Posted in Oracle onJune 25, 2022

前言

Oracle的事务开始于一个DML语句。

当以下情况发生时,事务结束:

1、COMMIT/ROLLBACK

2、执行了DDL/DCL语句

3、客户端主动断开数据库的连接(DISCONNECT)

4、数据库关闭(宕机)

另外,一个DDL/DCL语句实际上就是一个事务,其中隐含了COMMIT。

Oracle不需要特别的去指定事务的开始和结束。一个事务的结束就是下一个事务的开始。

事务是用来分割数据库活动的逻辑工作单元。事务既有起点,也有终点:当发生下列事件时,事务就开始了:

1.连接到数据库上,并执行第一条DML语句

2.前一个事务结束后,又输入另外一条DML语句

在下列事件之一发生时,事务就结束了:

1.执行Commit或者RollBack语句

2.执行一条DDL语句,例如Create Table语句;在这种情况下,会自动执行Commit语句

3.执行一条DCL语句,例如Grant语句;在这种情况下,会自动执行Commit语句

4.断开与数据库链接。在退出SQLPlus事,通常会输入EXit命令,此时会自动执行Commit语句。如果SQLPlus被意外终止(例如运行SQL*Plus的计算机崩溃)那么就会执行RollBack语句

事务完成后,如果不显式的提交或者回滚事务,都被认为是不好的编程习惯,因此确保在每个事物后面都要执行Commit或者RollBack语句。

事务中任何地方都可以设置一个保存点(savepoint),这样可以将修改回滚到保存点处。

commit

create table  transaction_table8 as select * from dba_objects;
insert into transaction_table8 select * from transaction_table8;

Oracle数据库事务的开启与结束详解

select xid, status from v$transaction;

Oracle数据库事务的开启与结束详解

Truncate – DDL

Oracle数据库事务的开启与结束详解
Oracle数据库事务的开启与结束详解

select xxx for update

select * from transaction_table8 where rownum=1 for update;

Oracle数据库事务的开启与结束详解

Oracle数据库事务的开启与结束详解

select…for update使用方法

作用:

select for update 是为了在查询时,避免其他用户以该表进行插入,修改或删除等操作,造成表的不一致性.

给你举几个例子:

select * from t for update 会等待行锁释放之后,返回查询结果。
select * from t for update nowait 不等待行锁释放,提示锁冲突,不返回结果
select * from t for update wait 5 等待5秒,若行锁仍未释放,则提示锁冲突,不返回结果
select * from t for update skip locked 查询返回查询结果,但忽略有行锁的记录

SELECT...FOR UPDATE 语句的语法如下:

  SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];

其中:

  OF 子句用于指定即将更新的列,即锁定行上的特定列。

  WAIT 子句指定等待其他用户释放锁的秒数,防止无限期的等待。

“使用FOR UPDATE WAIT”子句的优点如下:

  1防止无限期地等待被锁定的行;

  2允许应用程序中对锁的等待时间进行更多的控制。

  3对于交互式应用程序非常有用,因为这些用户不能等待不确定

  4 若使用了skip locked,则可以越过锁定的行,不会报告由wait n 引发的‘资源忙’异常报告

补充几点:

分成两类:加锁范围子句和加锁行为子句

加锁范围子句:在select…for update之后,可以使用of子句选择对select的特定数据表进行加锁操作。默认情况下,不使用of子句表示在select所有的数据表中加锁

加锁行为子句:当我们进行for update的操作时,与普通select存在很大不同。一般select是不需要考虑数据是否被锁定,最多根据多版本一致读的特性读取之前的版本。加入for update之后,Oracle就要求启动一个新事务,尝试对数据进行加锁。如果当前已经被加锁,默认的行为必然是block等待。使用nowait子句的作用就是避免进行等待,当发现请求加锁资源被锁定未释放的时候,直接报错返回。

在日常中,我们对for update的使用还是比较普遍的,特别是在如pl/sql developer中手工修改数据。此时只是觉得方便,而对for update真正的含义缺乏理解。

For update是Oracle提供的手工提高锁级别和范围的特例语句。Oracle的锁机制是目前各类型数据库锁机制中比较优秀的。所以,Oracle认为一般不需要用户和应用直接进行锁的控制和提升。甚至认为死锁这类锁相关问题的出现场景,大都与手工提升锁有关。

所以,Oracle并不推荐使用for update作为日常开发使用。而且,在平时开发和运维中,使用了for update却忘记提交,会引起很多锁表故障。 那么,什么时候需要使用for update?就是那些需要业务层面数据独占时,可以考虑使用for update。场景上,比如火车票订票,在屏幕上显示邮票,而真正进行出票时,需要重新确定一下这个数据没有被其他客户端修改。所以,在这个确认过程中,可以使用for update。这是统一的解决方案方案问题,需要前期有所准备。

失败的DML 和 exit

Oracle数据库事务的开启与结束详解

Oracle数据库事务的开启与结束详解

DCL

Oracle数据库事务的开启与结束详解

Oracle数据库事务的开启与结束详解

Oracle数据库事务的开启与结束详解

总结 

到此这篇关于Oracle数据库事务的开启与结束的文章就介绍到这了,更多相关Oracle事务开启与结束内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Oracle 相关文章推荐
oracle DGMGRL ORA-16603报错的解决方法(DG Broker)
Apr 06 Oracle
oracle通过存储过程上传list保存功能
May 12 Oracle
zabbix agent2 监控oracle数据库的方法
May 13 Oracle
Oracle11g R2 安装教程完整版
Jun 04 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
Oracle 死锁的检测查询及处理
Sep 25 Oracle
oracle索引总结
Sep 25 Oracle
关于Oracle12C默认用户名system密码不正确的解决方案
Oct 16 Oracle
详细聊聊Oracle表碎片对性能有多大的影响
Mar 19 Oracle
Lakehouse数据湖并发控制陷阱分析
Mar 31 Oracle
排查并解决Oracle sysaux表空间异常增长
Apr 20 Oracle
在Oracle表中进行关键词搜索的过程
Jun 10 #Oracle
Oracle锁表解决方法的详细记录
Jun 05 #Oracle
oracle数据库去除重复数据
May 20 #Oracle
解决Oracle数据库用户密码过期
May 11 #Oracle
Oracle中DBLink的详细介绍
instantclient客户端 连接oracle数据库
清空 Oracle 安装记录并重新安装
You might like
同一空间绑定多个域名而实现访问不同页面的PHP代码
2006/12/06 PHP
php 更新数据库中断的解决方法
2009/06/05 PHP
了解Joomla 这款来自国外的php网站管理系统
2010/03/11 PHP
php的webservice的wsdl的XML无法显示问题的解决方法
2014/03/11 PHP
linux使用crontab实现PHP执行计划定时任务
2014/05/10 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
Yii的Srbac插件用法详解
2016/07/14 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
用JavaScript对JSON进行模式匹配(Part 1-设计)
2010/07/17 Javascript
Dom与浏览器兼容性说明
2010/10/25 Javascript
javascript学习笔记(十一) 正则表达式介绍
2012/06/20 Javascript
js倒计时小程序
2013/11/05 Javascript
浅谈 javascript 事件处理
2015/01/04 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
使用layui的router来进行传参的实现方法
2019/09/06 Javascript
React中使用Vditor自定义图片详解
2020/12/25 Javascript
PyTorch的深度学习入门之PyTorch安装和配置
2019/06/27 Python
基于keras 模型、结构、权重保存的实现
2020/01/24 Python
python zip()函数的使用示例
2020/09/23 Python
html5 canvas绘制矩形和圆形的实例代码
2016/06/16 HTML / CSS
Brasty波兰:香水、化妆品、手表网上商店
2019/04/15 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
大学生咖啡店创业计划书
2014/01/21 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
主持人演讲稿
2014/05/13 职场文书
小学国庆节活动方案策划书
2014/09/16 职场文书
会议接待欢迎词范文
2015/01/26 职场文书
2015年七夕情人节活动方案
2015/05/06 职场文书
恰同学少年观后感
2015/06/08 职场文书
一文搞懂php的垃圾回收机制
2021/06/18 PHP
POST提交数据常见的四种方式
2022/01/18 HTML / CSS
拙作再改《我的收音机情缘》
2022/04/05 无线电
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL