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.按照这个时间换空间的思路,可以利用一个周期来完成
不直接更新所有的用户信息,而是让每一个用户信息,在使用的时候才进行更新
虽然不是所有的用户立刻都发生了改变,但是慢慢地大部分的活跃用户就都进行了修改,而那些僵尸用户,可以再集中进行处理