当前位置: 首页 > news >正文

事务处理

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645

事务处理

事务是保证数据完整性的一种手段。

事务具备 ACID 原则(包括原子性、一致性、独立性及持久性),保证一个人更新数据的时候,其他人不能更新。

在 Oracle 中,SQL Plus 是一个客户端。但是对于 Oracle 服务而言,每一个 SQL Plus 客户端都是独立的,都使用一个session 描述。

如下图所示。所有的更新都是暂存在缓冲区,直到提交为止,在没有提交之前,还可以使用回滚操作恢复数据到原始状态

事务处理提供了两个核心命令

提交事务:commit

回滚事务:rollback

真正使用 commit 提交后才表示更新已经正常完成。所有的更新操作都需要被事务所保护 

例如,小桃要给小李汇款

1. 从小桃的账户上减少 5000 万元

2. 在小李的账户上增加 5000 万元

3. 扣除转账手续费 50 元

假如说现在第 2 步没有实现,小桃的账上应该恢复 5000 万元,但是如果没有事务处理,现在更新金额,就表示数据已经正常提交了,不管小李的账户上是否增加,小桃的金额都会减少。所以事务的好处是在一组更新操作全部完成之后再进行提交处理,这样才可以保证数据的完整性

概括起来,事务处理的概念就是整个操作要成功就一起成功,要失败就退回原点

如果按照之前的讲解,每一个 session 都进行自己的事务处理,那么如果现在两个 session 同时操作了同一条数据该如何呢?

第一个 session 更新员工编号为 7566 的员工信息

update myemp set sal=5000 where empno=7566;

此时的 session 并没有提交或回滚事务

第二个 session 更新员工编号为 7566 的员工信息

update myemp set comm=9000 where empno=7566;

 此时发现更新操作并不能完成,因为两个不同的 session 更新了同一条数据,那么此时就会出现一种情况:

在第一个 session 没有提交或回滚之前,第二个 session 要一直等待第一个 session 更新完成才能进行自己的操作

所以在事务的处理过程中,存在行级锁定的概念,在提交或回滚更新之前,只能有一个 session 操作数据,即事务的隔离性 

虽然这种事务的处理很方便,但是这种锁定就很麻烦了

假设一个站点平均每秒在线人数有 300 人,并且假设这个站点的用户有 3000 万个(这 3000 万个用户如果要登录,还需要进行一些数据表的更新操作)

突然有一天,网站的老板让你把所有用户的某一个字段的内容统一更新为一个数据

那么这个时候有两个解决方案 

1.直接发出 update更新全部指令,目的是让 3000 万条数据一起完成更新

假设现在每更新 10 条数据需要 1 秒时间,总的更新时间为 3000000 秒(大约 34 天)

这就意味着在这 34 天之内,因为事务的隔离,所有的用户无法登录

在整个程序的世界里面只有两个方法可以评价程序:时间复杂度、空间复杂度。现在发现,第一种做法实际上是拿时间换空间

2.按照这个时间换空间的思路,可以利用一个周期来完成

不直接更新所有的用户信息,而是让每一个用户信息,在使用的时候才进行更新

虽然不是所有的用户立刻都发生了改变,但是慢慢地大部分的活跃用户就都进行了修改,而那些僵尸用户,可以再集中进行处理

相关文章:

  • sqoop-import 详解
  • 【论文精读】Mask R-CNN
  • H5:列表
  • MathType玩耍指南
  • 分享一个AI工程师从入门到精通学习路径
  • 智能合约的编程语言
  • 城市平均高温、平均低温数据爬取与可视化
  • 2195. 深海机器人问题(网络流,费用流,上下界可行流,网格图模型)
  • cookie和session的区别(七大不同)
  • [LeetBook]【学习日记】获取子字符串 + 颠倒子字符串顺序
  • Ruoyi框架上传文件
  • 超级副业SOP,各行各业,太全了!
  • VM新建虚拟机
  • Flask g对象和插件
  • 手写分布式配置中心(二)实现分布式配置中心的简单版本
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • 【407天】跃迁之路——程序员高效学习方法论探索系列(实验阶段164-2018.03.19)...
  • 【技术性】Search知识
  • 30天自制操作系统-2
  • 5、React组件事件详解
  • Effective Java 笔记(一)
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • js对象的深浅拷贝
  • js算法-归并排序(merge_sort)
  • Node.js 新计划:使用 V8 snapshot 将启动速度提升 8 倍
  • SegmentFault 技术周刊 Vol.27 - Git 学习宝典:程序员走江湖必备
  • vue从创建到完整的饿了么(18)购物车详细信息的展示与删除
  • 代理模式
  • 来,膜拜下android roadmap,强大的执行力
  • 思维导图—你不知道的JavaScript中卷
  • 详解移动APP与web APP的区别
  • 用简单代码看卷积组块发展
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • ​linux启动进程的方式
  • # 透过事物看本质的能力怎么培养?
  • (1)STL算法之遍历容器
  • (Java数据结构)ArrayList
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)spring boot建达集团公司平台 毕业设计 141538
  • (附源码)计算机毕业设计大学生兼职系统
  • (强烈推荐)移动端音视频从零到上手(下)
  • (转)Scala的“=”符号简介
  • (转)关于如何学好游戏3D引擎编程的一些经验
  • (转载)OpenStack Hacker养成指南
  • ... fatal error LINK1120:1个无法解析的外部命令 的解决办法
  • .net 8 发布了,试下微软最近强推的MAUI
  • .Net 访问电子邮箱-LumiSoft.Net,好用
  • .net 受管制代码
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET国产化改造探索(一)、VMware安装银河麒麟
  • /dev/sda2 is mounted; will not make a filesystem here!
  • [20181219]script使用小技巧.txt
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决