事務的read only mode
事務的read only mode
在session 1中設定事務的模式為read noly,同時執行一個查詢。
SQL> set transaction read only;
Transaction set.
SQL> select sum(salary) from employees;
SUM(SALARY)
-----------
692850
在session 2 中執行一個update 語句。
SQL> update employees
2 set salary = salary + 100
3 /
107 rows updated.
SQL> commit;--提交事務,持久化到資料庫。
Commit complete.
返回到session 1 中執行同樣的查詢,得到的結果和第一次的查詢時一樣的。
執行一個commit 或者rollback 語句,終止事務的read only 模式。再次執行
同樣的查詢,在這次的查詢中可見session 2 中的提交的事務的修改。
SQL> select sum(salary) from employees;
SUM(SALARY)
-----------
692850
SQL> commit;
Commit complete.
SQL> select sum(salary) from employees;
SUM(SALARY)
-----------
703550
事務的read only mode 是用來避免不可重複讀和幻讀的。設定了read only mode 在事務
中只能看見執行set transaction read only 語句以前提交的資料,事務read only mode期間
其他事務的修改是不可見的,oracle將會使用 undo data 資料來提供讀一致性。
上面的例子是關於事務的read only mode用來避免不可重複讀的,下面的例子將演示
事務的read only mode 用來避免幻讀.
在session 1 中設定事務的模式為 read only。並執行一個查詢。
SQL> set transaction read only;
Transaction set.
SQL> select count(*) from employees;
COUNT(*)
----------
107
在session 2 中執行一條insert 語句並提交。
SQL> insert into employees
2 (employee_id, last_name, email,
3 hire_date, job_id) values (210,
4 'Hintz', 'JHINTZ', SYSDATE,
5 'SH_CLERK');
1 row created.
SQL> commit;
Commit complete.
返回到session 1 中,執行同樣的查詢,由結果可知當設定了事務的模式為read only 以後
不會產生幻讀。session 1 中的 read only mode 事務開始以後,其他事務執行的insert
語句對session 1 中的事務是不可見的,從而避免幻讀。
SQL> select count(*) from employees;
COUNT(*)
----------
107
SQL> commit;--結束事務的read only mode。
Commit complete.
SQL> select count(*) from employees;
COUNT(*)
----------
108
下面演示一個事務在read only mode 模式下應該注意的一個問題。
SQL> show user
USER is "HR"
SQL> set transaction read only;
Transaction set.
SQL> select salary from hr.employees
2 where employee_id = 100;
SALARY
----------
24000
SQL> update employees
2 set salary = salary - 300
3 where employee_id = 100;
update employees
*
ERROR at line 1:
ORA-01456: 不能在 READ ONLY 事務處理中執行插入/刪除/更新操作
事務在read only mode 下,不能執行DML操作,原因很明顯嘛,事務是隻讀的而不是預設的read,write.
如果換成sys 使用者,那就沒有這個限制了。
小結:事務的read only mode 是事務隔離等級中的一種,當需要在運用程式中避免
不可重複讀或者幻讀的時候可以使用,同時應該注意可能出現的問題。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/26110315/viewspace-730637/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Innodb Read Only Mode
- 3.2.3 Opening a Database in Read-Only ModeDatabase
- Open a Database in Read-Only Mode (301)Database
- Seed Database (pdb$seed) - Read Write OR Read Only Mode in Oracle Database 12cDatabaseOracle
- oracle set transaction read only與dbms_transaction實現事務transaction控制Oracle
- oracle 表空間和表 read only遷移後不再read onlyOracle
- 關於tablespace在read only狀態下的DML ,DDL操作--Read-Only Tablespaces
- read only tablespace backup restoreREST
- mysql sql_mode ONLY_FULL_GROUP_BYMySql
- 資料庫事務耗時過長導致Could not retrieve transaction read-only status from server異常資料庫Server
- CSS :read-only 選擇器CSS
- 當從READ ONLY到READ WRITE都做什麼了
- RMAN結合Read Only、Exclude的備份策略
- DG -- READ ONLY模式開啟物理Standby模式
- Oracle Isolation Levels : Read-only (317)Oracle
- MySQL sql_mode=only_full_group_by 錯誤MySql
- 如何理解mysql 的事務隔離級別 repeatable readMySql
- PostgreSQL原始碼定製:線上global read onlySQL原始碼
- mysql 5.7sql_mode=only_full_group_by問題MySql
- idea怎麼修改檔案的file is read-onlyIdea
- MySQL 報錯'Variable 'XXX' is a read only variable'MySql
- 作業系統報:read-only file system作業系統
- mysql 禁用 ONLY_FULL_GROUP_BY,暫時解決錯誤(sql_mode=only_full_group_by)MySql
- Select for update/lock in share mode 對事務併發性影響
- Why NHibernate updates DB on commit of read-only transactionMIT
- Read-Only Tables in Oracle Database 11g Release 1OracleDatabase
- 啟動dataguard備庫到read-only狀態
- oracle實驗記錄 (恢復read only tablespace(1))Oracle
- oracle實驗記錄 (恢復read only tablespace(2))Oracle
- 含read only表空間的資料庫的控制檔案重建資料庫
- 表空間read only和online的狀態轉換
- mysql(InnoDB)事務隔離級別(REPEATABLE READ) 與 鎖,MVCCMySqlMVC
- 搭建部落格時,被mysql的sql_mode中ONLY_FULL_GROMySql
- Oracle 11g 新特性:只讀表(Read-only)Oracle
- remount of /system failed: Read-only file system原因及解決REMAI
- 重建控制檔案與 datafile offline,tablespace read only
- Mysql的read_only 只讀屬性說明 (運維筆記)MySql運維筆記
- Oracle SYS使用者無法設定session級別的read onlyOracleSession