oracle事务操作例子,oracle 事务 与 提交
一般事务(DML)即数据修改(增、删、改)的事务
事务会将所有在事务中被修改的数据行加上锁(行级锁),来阻止其它人(会话)同时对这些数据的修改操作。
当事务被提交或回滚后,这些数据才会被释放锁。
举个例子:
当A操作一条数据N1后,暂未提交事务 ,此时B又上来操作同一条数据N1,这时的情况是:
1、所有除A以外的人看不到被A所修改后的数据
2、B会处于等待状态,直到A提交或回滚了针对这条数据的修改(这也就是行级锁的概念)
3、当A提交事务后,所有人可以看到被A修改后的数据,看不到B修改后的数据。但B能看到自己修改后的数据(与A一样,因为B还未提交事务)。
4、当B提交事务后,所有人可以看到被B修改后的数据。
由上可以看出,对同一条数据的事务处理,必须按先后顺序进行。
即:A先提交了事务后,B才可以提交事务,否则B将无法对这条数据进行修改(B会在操作这条数据时处于等待状态,直到A提交或回滚了事务,释放了这行数据的锁)。
这里注意一点,这里所说有A与B并不是指二个ORACLE帐户,而是二个连接会话。上面只是为了方便举例。
就是说即使是在同一台电脑上用同一个ORACLE帐户,但同时分别打开了二个连接会话(比如同时打开二个PL/sql并用相同帐户连接到同一个库中),就会被视为A、B两个人。
在PS/sql中,对数据修改完后,如果用户未提交事务,但关闭或断开了PS/sql,此时ORACLE会立即提交此会话的事务。
我们可以事务中使用保存点来回滚到指定的时间节点上来,但如果用提交事务(commit)后,所有保存点将被删除。
举个举子:
savepoint a1; --设置一个保存点 a1;
update tmp set username=‘张三‘ where userid=‘101‘ --修改一条数据
savepoint a2; --设置一个保存点 a1;
update tmp set username=‘李四‘ where userid=‘102 --再修改一条数据
rollback to a2; --回滚到a2 保存点。 此时在 a2 保存点之后的所有数据修改视为无效。
rollback to a1; --这里可以再从a2保存点再回滚到a1 保存点。 此时在 a1 保存点之后的所有数据修改视为无效。
rollback; --回滚全部。即撤消至上一次提交事务后的所有数据修改。
commit; --提交事务 将回滚后的事务提交,并会删除所有保存点。
注意:我们可以从a2向前再回滚到a1 ,但无法从a1回滚到a2。也就是只能向前回滚,不能从前面的点再向后回滚!
只读事务 即,只用于select 查询的事务
只读事务主要用于在某一个时间点对数据的查询统计。如:在18:00创建一个只读事务,然后可以开始统计某张表的记录数。此时18:00之后新添加到这张表中的数据就不会进入到统计中去。也就是创建只读事务的会话连接人,将无法看到在创建只读事务之后其它任何人对数据的真实修改。
方法是:
set transaction read only; --在此之后,拥有此会话的连接人将无法看到其它人对数据的任何改动。用户可以用select 进行此时间点的统计查询
set transaction read write; --取消只读事务
只读事务没有回滚和提交的功能也不记录回滚LOG。
只读事务最大的用处是保证在某个时间点查询结果的一致性。换句话说,如果你要统计很多信息,有多个select查询时,但你执行完第一个查询后(如用户信息统计),可能其它人进来修改了某些数据你正在查询的数据。这时你再进行第二个查询(如用户信息的统计或其它有关用户信息的查询)。这时候将出现数据查询结果的不一致,第二次查询的结果会由于数据被修改了而与第一次查询结果一不样。只读事务正是解决这类问题的办法。
其实ORACLE为了优化查询在对于单条查询时也会启动只读事务(就是在你开始执行查询时会有一个只读事务点,到查询结束前,在这期间的数据修改都被无视掉),你无须手动创建只读事务。但多条查询时我们就必须手动创建只读事务。
(来源:https://www.linuxidc.com/Linux/2012-07/66120.htm)
提交的类型:
提交数据有三种类型:
显式提交、隐式提交及自动提交。
1、显式提交:用COMMIT命令直接完成的提交为显式提交。其格式为:sql>COMMIT;
2、隐式提交:用sql命令间接完成的提交为隐式提交。这些命令是:ALTER,AUDIT,COMMENT,CONNECT,CREATE,DISCONNECT,DROP,EXIT,GRANT,NOAUDIT,QUIT,REVOKE,RENAME。(此隐式提交是在自己的session,如果在其他人的session(如用户a)中正在修改相同的数据,则引起隐式提交的语句(用户a的k另一个session)则必需等待)
3、自动提交:若把AUTOCOMMIT设置为ON,则在插入、修改、删除语句执行后,系统将自动进行提交,这就是自动提交。其格式为:sql>SET AUTOCOMMIT ON;
查看当前是否是自动提交:show autocommit;
隐式提交:
隐式提交的定义
又名自动提交,即无需显示执行commit语句,session中的操作被自动提交到数据库的过程。
隐式提交的方式
1、正常执行完ddl语句。包括create,alter,drop,truncate,rename。
2、正常执行完dcl语句。包括grant,revoke。
3、正常退出isql*plus,没有明确发出commit或者rollback。
隐式提交的注意事项
1、执行ddl语句时,前面的dml操作也会被提交到数据库中
因为是在一个session里,那执行ddl语句的时候前面的dml语句肯定也会“不可幸免”的被提交到库中。
2、即使ddl语句执行失败,前面的dml操作也会被提交到数据库中
这就有点儿让人奇怪了,ddl都执行失败了,怎么还会提交呢?这就需要探究一下隐式提交的本质了(下文有叙述)。
3、在前面1和2的基础上总结
为了避免隐式提交或者回滚,尽量保证一条或者几条DML操作完成后有显示的提交或者回滚,防止后续执行的DCL或者DDL自动提交前期的DML操作。
隐式提交的本质
1、一条ddl语句执行了两次commit
commit;
ddl statement;
commit;
第一个commit将当前session中未提交的事务隐式提交,以保证ddl语句失败时的回滚位置。
第二个commit将ddl
2、为什么需要隐式提交?
为了保证事务的一致性。我们在执行ddl语句的时候,oracle需要在它的系统表中进行元数据的记录操作(即:除了建表还会进行不少insert操作),如果它不隐式提交就无法保证一致性;从内部运行机制来看ddl语句和dml语句还是有很大区别的,dml会对每个语句的每条记录都做日志记录以便于回滚,而ddl往往没必要搞这么复杂,从功能和易用性上看隐式提交都是最好的选择。
(来源:https://www.linuxidc.com/wap.aspx?cid=7&nid=92704&sp=850)
oracle事务操作例子,oracle 事务 与 提交相关推荐
- 事务操作(搭建事务操作环境)
1.创建数据库表,添加记录 2.创建service,搭建dao,完成对象创建和注入关系 (1)service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSo ...
- 事务操作 mysql的事务操作
事务操作 举例: create table my_account( id int unsigned not null primary key auto_increment, account varch ...
- oracle的操作大全,Oracle数据库操作大全(六)Oracle中操作数据
Java连接数据库方法2,(方法1见:Oracle数据库操作大全(五)) 使用jdbc连接Oracle( 可远程连接 ) ***1.加载驱动 Class.forName("oracle.jd ...
- mysql事务操作_mysql的事务操作
倒着思考.杜绝纯粹的知识填鸭教育 少废话,是上代码: update table1 set money-100 where id=1; //A账户减少100元 update table2 set mon ...
- Oracle常用操作之ORACLE数据字典与视图
当ORACLE数据库系统启动后,数据字典总是可用,它驻留在SYSTEM表空间中.数据字典包含视图集,在许多情况下,每一视图集有三种视图包含有类似信息,彼此以前缀相区别,前缀为USER.ALL和DBA. ...
- oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例
关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...
- oracle 数据操作指令,ORACLE数据操作命令
1.表操作 创建表 CREATE TABLE test1 (column_name datetype,co_n dp); [主键 CONSTRAINT id_pk PRIMARY K ...
- c#oracle数据库操作类,Oracle数据库操作类(c#)
用OracleConnection连接Oracle 在Web.config中配置 public System.Data.OracleClient.OracleConnection cnn; /// / ...
- oracle 开启事务_javaSE第十四部分 JDBC(2)mysql事务和JDBC实现事务
一.事务的基本介绍 1. 概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败. 2. 操作: 1. 开启事务: start transaction; 2. 回滚 ...
最新文章
- Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...
- 蛇形矩阵c 语言怎么写,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
- crontab简单示例
- POJ2481-Cows【树状数组】
- 2018年软考网络规划设计师考试通过经验分享
- java编写母亲节快乐_写在母亲节来临之际
- TypeError: unorderable types: str() = int()
- python3.9性能_谁说Python性能差的
- Shell编程(CentOS7)
- K3C使用校园网折腾之路
- SSH框架java写接口_SSH框架的搭建+JPA接口
- 基于SpringBoot的外卖点餐管理系统
- AndrewNG机器学习听课笔记(1 )——线性回归(linear regression)
- flyingsaucer进行html文件转图片和pdf
- 郦旭东小可爱的大数据算法课程期末复习
- 从xgboost, lightgbm 到catboost
- 网易云视频播放器不使用Service实现后台播放
- 话费对接充值平台_手机话费误充给他人怎么办?小编带你找运营商要回来
- 函数——哥德巴赫猜想
- 你想看啥电子书,这里能帮你免费下载哦。给友友们推荐30+电子书下载网站或搜索引擎,以及3+电子书下载导航网站。
热门文章
- java计算机毕业设计宿迁学院学生设计作品交流网站源代码+数据库+系统+lw文档
- python异常处理中不会用到的关键字_Python异常处理中不会用到的关键字是
- 亚马逊养号用什么软件比较好?
- 浅谈云上攻防 --SSRF 漏洞带来的新威胁
- Word海报随意排版、链接文本框有妙招
- document.referrer 配合微信监听返回按钮优化用户体验
- uniapp项目前端埋点实现方案
- R75700U和R75800U的区别 锐龙r7 5700U和锐龙r7 5800U 哪个好
- 纸鸢|技术出身的人如何找到自己的商业模式
- 小学生课程表制作手工_小学生暑假自制课程表怎么制作