Insight Technology, Inc

Insight Technology, Inc

Japanese | English

May 15, 2002 -Vol. 44-
Ora! Ora! Oracle
Welcome to the world of Oracle enthusiasts
Free mail magazine for the people who want to know more about Oracle

ROLLBACK SEGMENT
Hello everyone. In this issue, I will analyze if transactions can be executed by each rollback segment for the number of times specified by CEIL(TRANSACTIONS/TRANSACTIONS_PER_ROLLBACK_SEGMENT)

I use ORACLE8.1.6 for NT and set DB_BLOCK_SIZE to 2K to analyze.

First of all, I examine the number of TRANSACTIONS_PER_ROLLBACK_SEGMENTS that I can specify at the maximum.

After I set TRANSACTIONS_PER_ROLLBACK_SEGMENT to 55 and start Oracle, following error message appears.
ORA-02093: TRANSACTIONS_PER_ROLLBACK_SEGMENT(55) more than maximum possible (21)

This error message suggests that TRANSACTIONS_PER_ROLLBACK_SEGMENT can be specified up to 21. Based on this fact, I start today's analysis.

2-1. Set TRANSACTIONS_PER_ROLLBACK_SEGMENT to 4.

SVRMGR> SHOW PARAMETER TRANSACTIONS_PER_ROLLBACK_SEGMENT

NAME                                 TYPE      VALUE
-----------------------------------  --------  -------
transactions_per_rollback_segment    integer   4

The result indicates that one rollback segment can handle four transactions at a time.

2-2. Create a table by using the following script.

----------------------------------POPSQL-------------------------------------
CONNECT SCOTT/TIGER
LOOP (l=0 ; l<50 ; l++)
 REM Variable \|\ is converted to a value.  Create fifty tables (A_0 to A_49)
 SQL CREATE TABLE A_\l\ AS SELECT * FROM EMP;
ENDLOOP
-----------------------------------------------------------------------------

2-3. Create fifty concurrent transactions by using the following two scripts, and then write these transactions to one rollback segment (rb_find50)
trun50.call executes trun50.job fifty times in the background. At the same time, trun50.call passes variable l.

----------POPSQL script name trun50.call---------------
CONNECT SCOTT/TIGER
LOOP (l=o ; l<50 ; l++)
 REM SYSTEM command is shell startup command
 REM popsql is a binary program to start POPSQL program
 REM Specify & to execute in the background
 SYSTEM popsql trun50.job \|\ &
ENDLOOP
-------------------------------------------------------

trun50.job receives a variable l, and issues UPDATE statement to table A_0 to A_49. Select rollback segment rb_find50.

---------------------------POPSQL script name trun50.job--------------------------
REM Receive a variable that is passed by argument
GETOPT l

CONNECT SCOTT/TIGER

REM PLSQL command executes PLSQL
REM Use specified rollback segment for DBMS_TRANSACTION. USE_ROLLBACK_SEGMENT
REM packages. (rb_find50)
REM Behave in the same way as SET TRANSACTION USE ROLLBACK SEGMENT rb_find50; does
PLSQL DBMS_TRANSACTION. USE_ROLLBACK_SEGMENT ('rb_find50');

REM UPDATE A_0 SET ENAME = 'KOBA';
SQL UPDATE A_\|\ SET ENAME = 'KOBA'; 

REM OERR is a delimiter to get Oracle error. If 0, process completes properly
REM With MESSAGE command, \|\ and \OERR\ are converted to values and are displayed
MESSAGE UPDATE A_\|\ SET ENAME = 'KOBA'; OERR=\OERR\

REM Sleep for 100 seconds to maintain the transaction
SLEEP 100
----------------------------------------------------------------------------------

2-4. Execute fifty transactions at a time. Let all of fifty transactions use rollback segment rb_find50.

C:\> popsql trun50.call

Following is the result of MESSAGE command by script trun50.job.

First 21 transactions terminate successfully.

UPDATE A_0 SET ENAME = 'KOBA'; OERR=0
UPDATE A_2 SET ENAME = 'KOBA'; OERR=0
UPDATE A_1 SET ENAME = 'KOBA'; OERR=0
UPDATE A_3 SET ENAME = 'KOBA'; OERR=0
UPDATE A_4 SET ENAME = 'KOBA'; OERR=0
UPDATE A_5 SET ENAME = 'KOBA'; OERR=0
UPDATE A_9 SET ENAME = 'KOBA'; OERR=0
UPDATE A_11 SET ENAME = 'KOBA'; OERR=0
UPDATE A_10 SET ENAME = 'KOBA'; OERR=0
UPDATE A_13 SET ENAME = 'KOBA'; OERR=0
UPDATE A_15 SET ENAME = 'KOBA'; OERR=0
UPDATE A_18 SET ENAME = 'KOBA'; OERR=0
UPDATE A_19 SET ENAME = 'KOBA'; OERR=0
UPDATE A_12 SET ENAME = 'KOBA'; OERR=0
UPDATE A_8 SET ENAME = 'KOBA'; OERR=0
UPDATE A_6 SET ENAME = 'KOBA'; OERR=0
UPDATE A_7 SET ENAME = 'KOBA'; OERR=0
UPDATE A_17 SET ENAME = 'KOBA'; OERR=0
UPDATE A_14 SET ENAME = 'KOBA'; OERR=0
UPDATE A_16 SET ENAME = 'KOBA'; OERR=0
UPDATE A_22 SET ENAME = 'KOBA'; OERR=0


Remaining 29 transactions terminate with ORA-1554.

UPDATE A_21 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_44 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_24 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_26 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_35 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_33 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_38 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_37 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_42 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_41 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_20 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_46 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_45 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_34 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_39 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_43 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_28 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_27 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_29 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_30 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_47 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_49 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_23 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_40 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_48 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_31 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_25 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_36 SET ENAME = 'KOBA'; OERR=1554
UPDATE A_32 SET ENAME = 'KOBA'; OERR=1554


ORA-01554: out of transaction slots in transaction tables
Cause: Too many concurrent transaction

Remember I set TRANSACTIONS_PER_ROLLBACK_SEGMENT to 4. The result of 2-4. in fact suggests that twenty-one transactions are specified. Twenty-one transactions also match the number of TRANSACTIONS_PER_ROLLBACK_SEGMENT that can be specified at the maximum.

As far as I analyze, one rollback segment can handle up to twenty-one transactions at a time, regardless of TRANSACTIONS_PER_ROLLBACK_SEGMENT value.
This TRANSACTIONS_PER_ROLLBACK_SEGMENT parameter therefore is used to determine the number of public rollback segments to start.

That's it for today. See you next week.

Osamu Kobayashi

 Subscribe & Unsubscribe