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 区块链表创建过程详解
May 15 Oracle
ORACLE数据库应用开发的三十个注意事项
Jun 07 Oracle
DBCA命令行搭建Oracle ADG的流程
Jun 11 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
详解Oracle块修改跟踪功能
Nov 07 Oracle
oracle重置序列从0开始递增1
Feb 28 Oracle
oracle删除超过N天数据脚本的方法
Feb 28 Oracle
Oracle 多表查询基本语法实例
Apr 18 Oracle
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
Jun 28 Oracle
ORACLE中dbms_output.put_line输出问题的解决过程
Jun 28 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
在项目中寻找代码的坏命名
2012/07/14 PHP
PHP中使用虚代理实现延迟加载技术
2014/11/05 PHP
php 删除一维数组中某一个值元素的操作方法
2018/02/01 PHP
Laravel5.1框架注册中间件的三种场景详解
2019/07/09 PHP
PHP getID3类的使用方法学习笔记【附getID3源码下载】
2019/10/18 PHP
jQuery $.get 的妙用 访问本地文本文件
2012/07/12 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
js 获取(接收)地址栏参数值的方法
2013/04/01 Javascript
查找iframe里元素的方法可传参
2013/09/11 Javascript
JavaScript中的运算符种类及其规则介绍
2013/09/26 Javascript
JS关闭窗口或JS关闭页面的几种代码分享
2013/10/25 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
2015/04/22 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
vue-router路由与页面间导航实例解析
2017/11/07 Javascript
Spring Boot/VUE中路由传递参数的实现代码
2018/03/02 Javascript
用react-redux实现react组件之间数据共享的方法
2018/06/08 Javascript
javascript实现摄像头拍照预览
2019/09/30 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
VUE实现吸底按钮
2021/03/04 Vue.js
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
python进阶教程之函数对象(函数也是对象)
2014/08/30 Python
python使用多线程不断刷新网页的方法
2015/03/31 Python
python 读写、创建 文件的方法(必看)
2016/09/12 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
Django 拆分model和view的实现方法
2019/08/16 Python
Python如何应用cx_Oracle获取oracle中的clob字段问题
2019/08/27 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
python写文件时覆盖原来的实例方法
2020/07/22 Python
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
美国豪华时尚女性精品店:Kirna Zabête
2018/01/11 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
介绍一下游标
2012/01/10 面试题
生物制药毕业生自荐信
2013/10/16 职场文书
社会调查研究计划书
2014/05/01 职场文书
政府采购方案
2014/06/12 职场文书