網站首頁 編程語言 正文
前言
Oracle的事務開始于一個DML語句。
當以下情況發生時,事務結束:
1、COMMIT/ROLLBACK
2、執行了DDL/DCL語句
3、客戶端主動斷開數據庫的連接(DISCONNECT)
4、數據庫關閉(宕機)
另外,一個DDL/DCL語句實際上就是一個事務,其中隱含了COMMIT。
Oracle不需要特別的去指定事務的開始和結束。一個事務的結束就是下一個事務的開始。
事務是用來分割數據庫活動的邏輯工作單元。事務既有起點,也有終點:當發生下列事件時,事務就開始了:
1.連接到數據庫上,并執行第一條DML語句
2.前一個事務結束后,又輸入另外一條DML語句
在下列事件之一發生時,事務就結束了:
1.執行Commit或者RollBack語句
2.執行一條DDL語句,例如Create Table語句;在這種情況下,會自動執行Commit語句
3.執行一條DCL語句,例如Grant語句;在這種情況下,會自動執行Commit語句
4.斷開與數據庫鏈接。在退出SQLPlus事,通常會輸入EXit命令,此時會自動執行Commit語句。如果SQLPlus被意外終止(例如運行SQL*Plus的計算機崩潰)那么就會執行RollBack語句
事務完成后,如果不顯式的提交或者回滾事務,都被認為是不好的編程習慣,因此確保在每個事物后面都要執行Commit或者RollBack語句。
事務中任何地方都可以設置一個保存點(savepoint),這樣可以將修改回滾到保存點處。
commit
create table transaction_table8 as select * from dba_objects;
insert into transaction_table8 select * from transaction_table8;
select xid, status from v$transaction;
Truncate – DDL
select xxx for update
select * from transaction_table8 where rownum=1 for update;
select…for update使用方法
作用:
select for update 是為了在查詢時,避免其他用戶以該表進行插入,修改或刪除等操作,造成表的不一致性.
給你舉幾個例子:
select * from t for update 會等待行鎖釋放之后,返回查詢結果。
select * from t for update nowait 不等待行鎖釋放,提示鎖沖突,不返回結果
select * from t for update wait 5 等待5秒,若行鎖仍未釋放,則提示鎖沖突,不返回結果
select * from t for update skip locked 查詢返回查詢結果,但忽略有行鎖的記錄
SELECT...FOR UPDATE 語句的語法如下:
SELECT ... FOR UPDATE [OF column_list][WAIT n|NOWAIT][SKIP LOCKED];
其中:
OF 子句用于指定即將更新的列,即鎖定行上的特定列。
WAIT 子句指定等待其他用戶釋放鎖的秒數,防止無限期的等待。
“使用FOR UPDATE WAIT”子句的優點如下:
1防止無限期地等待被鎖定的行;
2允許應用程序中對鎖的等待時間進行更多的控制。
3對于交互式應用程序非常有用,因為這些用戶不能等待不確定
4 若使用了skip locked,則可以越過鎖定的行,不會報告由wait n 引發的‘資源忙’異常報告
補充幾點:
分成兩類:加鎖范圍子句和加鎖行為子句
加鎖范圍子句:在select…for update之后,可以使用of子句選擇對select的特定數據表進行加鎖操作。默認情況下,不使用of子句表示在select所有的數據表中加鎖
加鎖行為子句:當我們進行for update的操作時,與普通select存在很大不同。一般select是不需要考慮數據是否被鎖定,最多根據多版本一致讀的特性讀取之前的版本。加入for update之后,Oracle就要求啟動一個新事務,嘗試對數據進行加鎖。如果當前已經被加鎖,默認的行為必然是block等待。使用nowait子句的作用就是避免進行等待,當發現請求加鎖資源被鎖定未釋放的時候,直接報錯返回。
在日常中,我們對for update的使用還是比較普遍的,特別是在如pl/sql developer中手工修改數據。此時只是覺得方便,而對for update真正的含義缺乏理解。
For update是Oracle提供的手工提高鎖級別和范圍的特例語句。Oracle的鎖機制是目前各類型數據庫鎖機制中比較優秀的。所以,Oracle認為一般不需要用戶和應用直接進行鎖的控制和提升。甚至認為死鎖這類鎖相關問題的出現場景,大都與手工提升鎖有關。
所以,Oracle并不推薦使用for update作為日常開發使用。而且,在平時開發和運維中,使用了for update卻忘記提交,會引起很多鎖表故障。 那么,什么時候需要使用for update?就是那些需要業務層面數據獨占時,可以考慮使用for update。場景上,比如火車票訂票,在屏幕上顯示郵票,而真正進行出票時,需要重新確定一下這個數據沒有被其他客戶端修改。所以,在這個確認過程中,可以使用for update。這是統一的解決方案方案問題,需要前期有所準備。
失敗的DML 和 exit
DCL
總結?
原文鏈接:https://blog.csdn.net/hezuijiudexiaobai/article/details/124899077
相關推薦
- 2022-12-04 Android組件化工具ARouter使用方法詳細分析_Android
- 2022-08-19 Python利用memory_profiler查看內存占用情況_python
- 2022-08-27 .net+FusionChart實現動態顯示的柱狀圖和餅狀圖_實用技巧
- 2022-04-09 增強一個類功能三個方法
- 2023-01-31 go中make用法及常見的一些坑_Golang
- 2023-09-12 git常用指令
- 2022-11-22 python枚舉類型定義與使用講解_python
- 2023-07-29 [plugin:vite:import-analysis]Failed to resolve imp
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支