一般事务(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. 事务操作(搭建事务操作环境)

    1.创建数据库表,添加记录 2.创建service,搭建dao,完成对象创建和注入关系 (1)service注入dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSo ...

  2. 事务操作 mysql的事务操作

    事务操作 举例: create table my_account( id int unsigned not null primary key auto_increment, account varch ...

  3. oracle的操作大全,Oracle数据库操作大全(六)Oracle中操作数据

    Java连接数据库方法2,(方法1见:Oracle数据库操作大全(五)) 使用jdbc连接Oracle( 可远程连接 ) ***1.加载驱动 Class.forName("oracle.jd ...

  4. mysql事务操作_mysql的事务操作

    倒着思考.杜绝纯粹的知识填鸭教育 少废话,是上代码: update table1 set money-100 where id=1; //A账户减少100元 update table2 set mon ...

  5. Oracle常用操作之ORACLE数据字典与视图

    当ORACLE数据库系统启动后,数据字典总是可用,它驻留在SYSTEM表空间中.数据字典包含视图集,在许多情况下,每一视图集有三种视图包含有类似信息,彼此以前缀相区别,前缀为USER.ALL和DBA. ...

  6. oracle索引使用例子,Oracle中利用函数索引处理数据倾斜案例

    关于B-Tree.Bitmap.函数索引的相关内容请参考另一篇博文: Oracle中B-Tree.Bitmap和函数索引使用案例总结 通常来说,索引选取的数据列最好为分散度高.选择性好.从索引树结构的 ...

  7. oracle 数据操作指令,ORACLE数据操作命令

    1.表操作 创建表 CREATE  TABLE  test1 (column_name  datetype,co_n  dp); [主键   CONSTRAINT  id_pk  PRIMARY  K ...

  8. c#oracle数据库操作类,Oracle数据库操作类(c#)

    用OracleConnection连接Oracle 在Web.config中配置 public System.Data.OracleClient.OracleConnection cnn; /// / ...

  9. oracle 开启事务_javaSE第十四部分 JDBC(2)mysql事务和JDBC实现事务

    一.事务的基本介绍 1. 概念: 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败. 2. 操作: 1. 开启事务: start transaction; 2. 回滚 ...

最新文章

  1. Spring的jdbcTemplate 与原始jdbc 整合c3p0的DBUtils 及Hibernate 对比 Spring配置文件生成约束的菜单方法...
  2. 蛇形矩阵c 语言怎么写,蛇形矩阵输出是要怎么写代码,感觉没有眉目啊,大佬能说一下思想吗...
  3. crontab简单示例
  4. POJ2481-Cows【树状数组】
  5. 2018年软考网络规划设计师考试通过经验分享
  6. java编写母亲节快乐_写在母亲节来临之际
  7. TypeError: unorderable types: str() = int()
  8. python3.9性能_谁说Python性能差的
  9. Shell编程(CentOS7)
  10. K3C使用校园网折腾之路
  11. SSH框架java写接口_SSH框架的搭建+JPA接口
  12. 基于SpringBoot的外卖点餐管理系统
  13. AndrewNG机器学习听课笔记(1 )——线性回归(linear regression)
  14. flyingsaucer进行html文件转图片和pdf
  15. 郦旭东小可爱的大数据算法课程期末复习
  16. 从xgboost, lightgbm 到catboost
  17. 网易云视频播放器不使用Service实现后台播放
  18. 话费对接充值平台_手机话费误充给他人怎么办?小编带你找运营商要回来
  19. 函数——哥德巴赫猜想
  20. 你想看啥电子书,这里能帮你免费下载哦。给友友们推荐30+电子书下载网站或搜索引擎,以及3+电子书下载导航网站。

热门文章

  1. java计算机毕业设计宿迁学院学生设计作品交流网站源代码+数据库+系统+lw文档
  2. python异常处理中不会用到的关键字_Python异常处理中不会用到的关键字是
  3. 亚马逊养号用什么软件比较好?
  4. 浅谈云上攻防 --SSRF 漏洞带来的新威胁
  5. Word海报随意排版、链接文本框有妙招
  6. document.referrer 配合微信监听返回按钮优化用户体验
  7. uniapp项目前端埋点实现方案
  8. R75700U和R75800U的区别 锐龙r7 5700U和锐龙r7 5800U 哪个好
  9. 纸鸢|技术出身的人如何找到自己的商业模式
  10. 小学生课程表制作手工_小学生暑假自制课程表怎么制作