设为首页 收藏本站
查看: 494|回复: 0

[经验分享] Oracle事务 行级锁 保存点 回滚 提交(转)

[复制链接]
YunVN网友  发表于 2016-8-16 07:33:33 |阅读模式
  一般事务(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为了优化查询在对于单条查询时也会启动只读事务(就是在你开始执行查询时会有一个只读事务点,到查询结束前,在这期间的数据修改都被无视掉),你无须手动创建只读事务。但多条查询时我们就必须手动创建只读事务。
  本篇文章来源于 Linux公社网站(www.iyunv.com)  原文链接:http://www.iyunv.com/Linux/2012-07/66120.htm

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-258509-1-1.html 上篇帖子: Oracle的UTL_FILE.FOPEN的用法(转) 下篇帖子: 项目中Oracle system表空间急剧膨胀问题分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表