1 事务的概念
事务是将数据库从一种一致性状态转变为另外一种一致性状态
2 事务的四个特征(ACID)
- 原子性(Atomicity):事务的所有执行要么一起成功,要么一起失败
- 一致性(Consistency):事务将数据从一种一致性状态转为另外一种一致性状态
- 隔离性(Isolation):事务中所有修改未提交的数据对其他事务是不可见的
- 持久性(Durability):事务一旦提交,数据就永久保存
2.1 DDL与原子性
DDL语句执行之前,会先自动执行一个commit,再执行DDL语句本身。
2.2 COMMIT_WAIT与持久性
oracle的持久性是依靠redo来保证的。一般情况下,commit执行时,只有数据对应的redo缓存写入到redo在线重做日志后,才会给客户端返回commit成功的信息。
COMMIT_WAIT参数有三个值WAIT、NOWAIT和FORCE_WAIT。当COMMIT_WAIT设置为NOWAIT时,commit执行时数据库无需等待redo缓存写入到redo在线重做日志,直接给客户端返回commit成功的信息。但是,这样子做,无法保证数据的持久性。因为此时commit成功,redo缓存并没有写入到redo在线重做日志。如果此时数据库突然关闭,redo缓存中的数据就会丢失,这次修改的数据无法通过在线重做日志进行恢复。
3 分布式事务
有时候,我们会使用DBLINK联合其他服务器上的oracle数据库执行一个事务。这种分布式事务,oracle是通过2PC(Two-Phase Commit Protocol,两阶段提交协议)实现事务的原子性的。2PC原理是oracle在处理分布式事务时,会指定一个数据库作为协调者,这个协调者在提交事务时,会询问各个数据库是否做好提交。如果每个数据库都回复确定提交,协调者告诉各个数据库进行提交。如果其他数据库有回复不可以提交,则协调者会让各个数据库进行回滚。
4 自治事务
当一个事务为自治事务时,这个事务的提交和回滚都不会影响父事务。例如,我们有如下一个自治事务的存储过程(使用pragma autonomous_transaction声明)
create or replace procedure Autonomous_Insert as
pragma autonomous_transaction;
begin
insert into bk_test values (2);
commit;
end;
我们执行如下SQL
begin
insert into bk_test values(1);
Autonomous_Insert;
rollback;
end;
查询结果
可见,刚才那段sql最后一个rollback,只回滚了数据为1的数据。Autonomous_Insert中的commit成功插入了数据2,却没有将父事务中的数据1进行commit。可见,Autonomous_Insert中的commit对于父事务是独立提交的。
5 事务过程中oracle实例的变化
- 事务开始
- 在共享池中查找对应的已经编译过的执行计划。如果没有找到,则生成执行计划
- 在数据库高速缓存中查找对应的数据块,如果没有找到,就从数据文件中读取对应的数据块,加载到数据库高速缓存中
- 在数据库高速缓存中修改对应的数据块,这些块就变成了脏块。同时在redo缓存中生成redo日志
- 当事务提交时,等待LGWR进程将redo缓存中的对应的redo日志全部写入到在线重做日志文件,写入完成后返回提交成功信息
- 当发生checkpoint时,DBWn进程会将对应的脏块写入到数据文件中。写入后CKPT进程更新数据文件和控制文件中的SCN信息
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库