[轉]ORACLE DBA TRANSACTIONS

来源:http://www.cnblogs.com/freeliver54/archive/2016/06/08/5569077.html
-Advertisement-
Play Games

本文轉自:http://blog.sina.com.cn/s/blog_66f845010100qelf.html 一, Transaction control 預設Transaction 由修改數據開始(獲得TX LOCK), 手工也可以用set transaction或DBMS_TRANSACT ...


本文轉自:http://blog.sina.com.cn/s/blog_66f845010100qelf.html

, Transaction control 預設Transaction 由修改數據開始(獲得TX LOCK), 手工也可以用set transactionDBMS_TRANSACTION來控制, COMMIT,ROLLBACK結束(ROLLBACK TO SAVEPOINT並不會結束一個TRANSACTION). TRANSACTION語句包含以下COMMIT, ROLLBACK, SAVEPOINT ,ROLLBACK TO SAVEPOINT, SET TRANSACTION(設置TRANSACTION相關特性) 自動控制 Statement-Level Atomicity create table t ( x int check ( x>0 ) ); Insert into t values ( 1 ); Insert into t values ( -1 ); TRANSACTION CONTROL如下所示 Savepoint statement1; Insert into t values ( 1 ); If error then rollback to statement1; Savepoint statement2; Insert into t values ( -1 ); If error then rollback to statement2; 在本例中T中有1而無-1 Procedure-Level Atomicity 作一個名為PPROCEDURE,裡面有兩個插入語句 create or replace procedure p 2 as 3 begin 4 insert into t values ( 1 ); 5 insert into t values (-1 ); 6 end; 然後調用此PROCEDURE P begin 2 p; 3 end; 相當於 begin 2 savepoint sp; 3 p; 4 exception 5 when others then 6 rollback to sp; 7 end; 也就是說兩個INSERT一起成功或失敗,本例中T表內沒有被插入數據。但是,如果我們加上exception則結果大不相同。 begin 2 p; 3 exception 4 when others then null; 5 end; 效果會和Statement-Level Atomicity例子的結果一樣,T表中有1,而-1插入失敗。   , 錯誤的TRANSACTION的習慣 首先, TRANSACTION要儘量短,因為LOCKBLOCK DATA是非常耗資源的。其次為了實現讓TRANSACTION儘量短而設置迴圈中定時提交是錯誤的. 大家肯定都有過類似的經驗,就是在PROCEDURE作一個大的LOOP時,有人會告訴你要定期提交,比如1000行一提交,他們的根據是
  1. 把大的TRANSACTIOn變成小的TRANSACTION效率更高,
  2. 而且會減少UNDO的使用,因而很大程度提高速度。
但是,這樣做會導致你的數據進入一個無法控制的狀態,只有全部作為一個TRANSACTIOn提交或會滾才能保證一致性,分為小的TRANSACTIOn後的後果就是可能造成一部份提交,一部份回滾,這樣你就需要另外複雜的手段,比如記錄發生錯誤的點,以便下次繼續。因此,建議不要用ROWNUM去判斷提交的點,而要用商業規則去判斷,比如根據性別,或省市等信息。 他們的第一個觀點是錯誤的,相同的任務,放在一個TRANSACTIOn中要比分開來運行要快很多(在不考慮其他影響,比如BLOCK)。 SQL> create table twwm as select * from all_objects; 表已創建。 SQL> create table twwm2 as select * from twwm; 表已創建。 SQL> update twwm2 set object_name=lower(object_name); 已更新29128行。 已用時間: 00: 00: 01.09 begin for x in ( select rowid rid, object_name, rownum r from TWWM ) loop update TWWM set object_name = lower(x.object_name) where rowid = x.rid; if ( mod(x.r,100) = 0 ) then commit; end if; end loop; commit; end; PL/SQL 過程已成功完成。 已用時間: 00: 00: 06.03 他們第二個觀點也是錯誤的,因為在一個TRANSACTION中多次COMMIT會導致UNDO可能被重用,而這樣的結果就是可能會發生ORA-01555: snapshot too old。會影響本身的應用。 SQL> create table twwm as select * from all_objects; 表已創建。 SQL> create index i_wwm on twwm(object_name); 索引已創建。 SQL> exec dbms_stats.gather_table_stats('SYS','TWWM',cascade=>true); PL/SQL 過程已成功完成。 然後為了試驗,設置一個小的UNDO TABLESPACE,非自動擴展 SQL> create undo tablespace undo_small datafile 'D:\ORACLE\ORADATA\SBTTEST\UNDO0 2.DBF' size 2M autoextend off 2 / 表空間已創建。 然後設置預設UNDO TABLESPACE為此UNDO_SMALL. SQL> alter system set undo_tablespace=undo_small; 系統已更改。 然後運行一個批量修改的PL/SQL . begin for x in ( select rowid rid, object_name, rownum r from TWWM where object_name > ' ' ) loop update TWWM set object_name = lower(x.object_name) where rowid = x.rid; if ( mod(x.r,100) = 0 ) then commit; end if; end loop; commit; end;   begin * ERROR 位於第 1 : ORA-01555: 快照過舊: 回退段號 11 在名稱為 "_SYSSMU11$" 過小 ORA-06512: line 2 當然,如果我們不COMMIT,那麼可能會導致 1 begin 2 for x in ( select rowid rid, object_name, rownumr 3 from TWWM 4 where object_name > ' ' ) 5 loop 6 update TWWM 7 set object_name = lower(x.object_name) 8 where rowid = x.rid; 9 end loop; 10 commit; 11* end; 12 / begin * ERROR 位於第 1 : ORA-30036: 無法按 8 擴展段 (在撤消表空間 'UNDO_SMALL' ) ORA-06512: line 6 但是, ORA-30036明顯比ORA-01555更容易接受,首先前面說過了, ORA-01555會導致數據一致性不可控制,並且ORA-01555是很難避免的,但是ORA-30036卻是可以解決的.所以, 多次COMMIT 並不會節省UNDO(錶面的節省是以失去數據為代價的, 同時,這個例子也證明在單用戶系統中也會發生ORA-01555). , Distributed Transactions 我們在一個TRANSACTION里可以連接多個DATABASE, 進行操作,一起提交或回滾. 連接多個資料庫一般通過DB LINK ,DB_LINK不能運行DDL,DCL.   , 自治 Transactions 自治TRANSACTIONTRANSACTION中的TRANSACTION,他的任何操作不影響外部TRANSACTION.做兩個PROCEDURE測試下 1 create or replace procedure Autonomous_Insert 2 as 3 pragma autonomous_transaction; 4 begin 5 insert into t values ( 'Autonomous Insert' ); 6 commit; 7* end; 8 / 過程已創建。 這裡的PRAGMA是編譯指示,告訴ORACLE 按什麼去編譯. 再建普通PROCEDURE create or replace procedure NonAutonomous_Insert as begin insert into t values ( 'NonAutonomous Insert' ); commit; end; 先運行NonAutonomous begin insert into t values ( 'Anonymous Block' ); NonAutonomous_Insert; rollback; end; PL/SQL 過程已成功完成。 SQL> select * from t; X -------------------- Anonymous Block NonAutonomous Insert 可以看到NonAutonomous_Insert中的COMMIT完成了提交任務,所以外部的ROLLBACK沒起作用. 清除數據再用Autonomous SQL> set timing off SQL> delete from t; 已刪除2行。 SQL> commit; 提交完成。 SQL> begin 2 insert into t values ( 'Anonymous Block' ); 3 Autonomous_Insert; 4 rollback; 5 end; 6 / PL/SQL 過程已成功完成。 SQL> select * from t; X -------------------- Autonomous Insert 看到autonomous transaction procedureCOMMIT並不影響外圍的TRANSACTION. autonomous transaction會用在什麼地方呢? 類似SELECT SEQ.NEXTVAL FROM DUAL這樣的TRANSACTION會用到autonomous transactions,當發出這樣的查詢後, TRANSACTION會讀並修改SYS.SEQ$, 並自行提交或回滾而不受外部TRANSACTION的影響,這也就是為什麼NEXTVAL不能回滾的原因. 還有很多朋友會考慮, 記錄下用戶的操作(比如對某個重要的表的UPDATE), 一般會考慮用TRIGGER 解決,但是, 如果UPDATE本身失敗了, 那麼TRIGGER 就不會記錄下操作, 而是隨UPDATE的失敗一塊回滾. 這個時候也需要考慮用autonomous transaction. (審計功能也是這原理) create table audit_tab 2 ( username varchar2(30) default user, 3 timestamp date default sysdate, 4 msg varchar2(4000) 5 )   create or replace trigger EMP_AUDIT 2 before update on emp 3 for each row 4 declare 5 pragma autonomous_transaction; 6 l_cnt number; 7 begin 8 9 select count(*) into l_cnt 10 from dual 11 where EXISTS ( select null 12 from emp 13 where empno = :new.empno 14 start with mgr = ( select empno 15 from emp 16 where ename = USER ) 17 connect by prior empno = mgr ); 18 if ( l_cnt = 0 ) 19 then 20 insert into audit_tab ( msg ) 21 values ( 'Attempt to update ' || :new.empno ); 22 commit; 23 24 raise_application_error( -20001, 'Access Denied' ); 25 end if; 26 end; TRIGGER自己提交自己的,而不受外部影響也不影響外部.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 冒泡排序 int temp ; int array[10] = {9,8,7,6,5,4,3,2}; for (int i = 0; i < 8; i ++) { for (int j = i+1; j < 8; j ++) { if (array[i] > array[j]) { temp = a ...
  • NSLog(@"%@",NSStringFromCGRect(switch.frame)); 或者 CFShow(NSStringFromCGRect(switch.frame)); 列印 CGSize : NSLog(@"%@",NSStringFromCGSize(someCG Size )); ...
  • 需要的軟體如沒有提供下載鏈接,文章中會註明! 首先下載 eclipse 安裝!(筆者提供的鏈接中沒有Eclipse下載!) 安裝完之後下載Jdk1.7安裝。 然後配置JDK跟ADT的環境變數。在此我提供會提供個一鍵配置的工具。請自行下載。大神當然請略過! 安卓工具下載:https://yunpan. ...
  • 一、極光推送工程端 1、下載SDK 極光推送是一個推送消息的第三方,SDK下載:https://www.jpush.cn/common/products 集成壓縮包內容:包名為JPush-iOS-SDK-{版本號} lib文件夾:包含頭文件 JPUSHService.h,靜態庫文件jpush-ios ...
  • 前幾篇文章已經從整體提供了診斷資料庫的各個方面問題的基本思路...也許對你很有用,也許你覺得離自己太遠。那麼今天我們從語句的一些優化寫法及一些簡單優化方法做一個介紹。這對於很多開發人員來說還是很有用的!為了方便閱讀給出前文鏈接: SQL SERVER全面優化 Expert for SQL Serve ...
  • 解決SQLSERVER2008 CPU使用率99%: 1、dbcc checkdb 重建索引 2、檢查有沒有死鎖 -- sp_lock SELECT request_session_id spid , OBJECT_NAME(resource_associated_entity_id) tableN ...
  • ORACLE資料庫中Global Database Name與DB LINKS的關係還真是有點糾纏不清,在說清楚這個關係前,我們先來瞭解一下Global Database Name的概念 Global DataBase Name 概念 1. What is a global database nam... ...
  • Mongodb在Mac中的安裝配置 @(Mongodb)[homebrew|LaunchDaemons|作者:victor] Mongodb 是基於分散式文件存儲的資料庫。由 C++ 語言編寫,旨在為 WEB 應用提供可擴展的高性能數據存儲解決方案。 MongoDB 是一個介於關係資料庫和非關係數據 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...