Understanding SET TRANSACTION In Oracle 19c
- Performance Tuning
- April 25, 2022
- 0 Comment
The SET TRANSACTION statement allows you to begin a read-only or read-write session,establish an isolation level,or assign the current transaction to a specified rollback segment or assign a name to the current transaction.
This statement must be the first SQL statement in a transaction,and it can appear only once.
SET TRANSACTION [ READ ONLY | READ WRITE ]
[ ISOLATION LEVEL [SERIALIZABLE | READ COMMITED ]
[ USE ROLLBACK SEGMENT ‘segment_name’ ]
[ NAME ‘transaction_name’ ];
This version makes the current transaction as read-only. In a read-only transaction,all subsequent queries see only those changes that were committed before the transaction began.This statement is useful when you are executing long-running, multiple query reports,and you want to make sure that the data used in the report is consistent.
Session 1 :-
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 777 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
SQL> UPDATE emp SET sal = 5 WHERE ename = 'SMITH';
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 5 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 2 :-
SQL> SET TRANSACTION READ ONLY;
Transaction set.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 5 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 1 :-
SQL> UPDATE emp SET sal = 10 WHERE ename = 'SMITH';
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 10 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 2 :-
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 5 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
This version makes the current transaction as read-write and is the default setting.
Session 1 :-
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 10 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
SQL> UPDATE emp SET sal = 15 WHERE ename = 'SMITH';
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 15 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 2 :-
SQL> SET TRANSACTION READ WRITE;
Transaction set.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 15 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 1 :-
SQL> UPDATE emp SET sal = 20 WHERE ename = 'SMITH';
1 row updated.
SQL> COMMIT;
Commit complete.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 20 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 2 :-
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 20 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
This version defines how transactions that modify the database should be handled.
• When you specify SERIALIZABLE, a DML statement that attempts to modify a table already modified in an uncommitted transaction will fail.
• If you specify READ COMMITTED, a DML statement that attempts to modify a table already modified in an uncommitted transaction will wait until those row locks are released. This is the default.
Session 1 :-
SQL> UPDATE emp SET sal = 25 WHERE ename = 'SMITH';
1 row updated.
--No COMMIT Has Been Issued.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 25 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 2 :-
SQL> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Transaction set.
SQL> UPDATE emp SET sal = 30 WHERE ename = 'SMITH';
<<<HANGS>>>
Session 1 :-
SQL> COMMIT;
Commit complete.
Session 2 :-
SQL> UPDATE emp SET sal = 30 WHERE ename = 'SMITH';
UPDATE EMP SET SAL = 30 WHERE ENAME = 'SMITH'
*
ERROR at line 1:
ORA-08177: can't serialize access for this transaction
Session 1 :-
SQL> UPDATE emp SET sal = 45 WHERE ename = 'SMITH';
1 row updated.
--No COMMIT Has Been Issued.
SQL> SELECT * FROM emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- --------- ---------- ---------- ----------
7369 SMITH CLERK 7902 17-DEC-80 45 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1617 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1275 500 30
7566 JONES MANAGER 7839 02-APR-81 5205 20
7654 MARTIN SALESMAN 7698 28-SEP-81 20013 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2865 30
7782 CLARK MANAGER 7839 09-JUN-81 2487 10
7788 SCOTT ANALYST 7566 19-APR-87 3026 20
7839 KING PRESIDENT 17-NOV-81 5034 10
7844 TURNER SALESMAN 7698 08-SEP-81 1524 0 30
7876 ADAMS CLERK 7788 23-MAY-87 11000 20
7900 JAMES CLERK 7698 03-DEC-81 12000 30
7902 FORD ANALYST 7566 03-DEC-81 3029 20
7934 MILLER CLERK 7782 23-JAN-82 13000 10
14 rows selected.
Session 2 :-
SQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Transaction set.
SQL> UPDATE emp SET sal = 50 WHERE ename = 'SMITH';
<<<HANGS>>>
Session 1 :-
SQL> COMMIT;
Commit complete.
Session 2 :-
SQL> UPDATE emp SET sal = 50 WHERE ename = 'SMITH';
1 row updated.
This version assigns the current transaction to the specified rollback segment and establishes the transaction as READ WRITE.
This statement cannot be used with SET TRANSACTION READ ONLY.
A Rollback Segment is a database object containing before-image of data written to the database.
Rollback segments are used to :-
Undo changes when a transaction is rolled back.
Recover the database to a consistent state in case of failures.
SQL> CONN / AS SYSDBA
Connected.
SQL> SELECT banner FROM v$version;
BANNER
--------------------------------------------------------------------------------
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
SQL> SELECT segment_name,tablespace_name FROM dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME
------------------------------ ------------------------------
SYSTEM SYSTEM
_SYSSMU1_3741171459$ UNDOTBS1
_SYSSMU2_1557575246$ UNDOTBS1
_SYSSMU3_3193270435$ UNDOTBS1
_SYSSMU4_2372004640$ UNDOTBS1
_SYSSMU5_553218552$ UNDOTBS1
_SYSSMU6_3809612316$ UNDOTBS1
_SYSSMU7_3306078869$ UNDOTBS1
_SYSSMU8_115127830$ UNDOTBS1
_SYSSMU9_4165470211$ UNDOTBS1
_SYSSMU10_3563521556$ UNDOTBS1
_SYSSMU11_3104252932$ UNDOTBS1
12 rows selected.
SQL> CREATE ROLLBACK SEGMENT rs1 TABLESPACE UNDOTBS1 STORAGE (INITIAL 20K NEXT 40K MINEXTENTS 2 MAXEXTENTS 50);
Rollback segment created.
SQL> SET TRANSACTION USE ROLLBACK SEGMENT rs1;
Transaction set.
This is really nice
Keep going to write so useful articles and also good that you have a lot of people who visits your website I can say it basede on the reviews you have here.
Thanks so much
It is remarkable, very useful piece