programmera.net -> oracle -> normal     för utskrift      info@programmera.net

Transaktioner i Oracle

1. Transaktioner
2. COMMIT
3. ROLLBACK
4. SAVEPOINT
5. SET TRANSACTION

1. Transaktioner

I Oracle är alla DML-kommandon (Datat Manipulation Language) bundna till en transaktion. Detta innebär att om man utför en INSERT, UPDATE, DELETE eller MERGE kommer förändringarna bara vara synliga för dig (din session) ända tills du skriver dem publikt till databasen med COMMIT. Man kan avsluta en transaktion på två sätt:

  • COMMIT: Betyder att förändringarna skrivs till databasen.
  • ROLLBACK: Betyder att förändringarna ignoreras och databasen går tillbaka till sitt tidigare tillstånd.
När en DML-sats körs händer följande i Oracle:
  1. Ändringarna loggas.
  2. Ändringarna utförs.
  3. Rollbackinformation skrivs till Rollbacksegmentet.
Eftersom COMMIT anropas mycket oftare än ROLLBACK har man implementerat Oracle så att COMMIT alltid går snabbare än ROLLBACK. Följande steg utförs under huven då COMMIT anropas:
  1. Rollbackinformationen raderas (markeras återanvändbar).
När ROLLBACK anropas sker å andra sidan detta:
  1. Alla ändringar som måste göras för att komma tillbaka till ursprungsläget läses från Rollbacksegmentet och loggas.
  2. Ändringarnas utförs.
  3. Rollbackinformationen raderas (markeras återanvändbar).
Här ser vi att det är mer arbet som utförs vid en ROLLBACK.

2. COMMIT

Vi testar att utföra några förändringar permanent i en tabell:
SQL> INSERT INTO dep (dep_pk, dep_name) VALUES(6,'HR');

1 rad är skapad.

SQL> COMMIT;

COMMIT är utfört.

SQL> SELECT * FROM dep;

DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
         6 HR

6 rader.

3. ROLLBACK

När man inte vill behålla de förändringar som har gjorts anropar man ROLLBACK. Nedan visas ett exempel:
SQL> INSERT INTO dep (dep_pk, dep_name) VALUES(7,'Grumbl');

1 rad är skapad.

SQL> SELECT * FROM dep;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
         7 Grumbl

6 rader.

SQL> ROLLBACK;

SQL> SELECT * FROM dep;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare

4. SAVEPOINT

Med SAVEPOINT kan man namnge olika stadier inuti en transaktion som man sedan kan rulla tillbaka till utan att hela transaktionen förstörs:
SQL> INSERT INTO dep (dep_pk, dep_name) VALUES(8,'Lager');

1 rad skapad.

SQL> SAVEPOINT olles_save;

SAVEPOINT är skapad.

SQL> INSERT INTO dep (dep_pk, dep_name) VALUES (9, 'Herrf');

1 rad skapad.

SQL> SELECT * FROM dep;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
         8 Lager
         9 Herrf

7 rader.

SQL> ROLLBACK TO SAVEPOINT olles_save

ROLLBACK är utfört.

SQL> SELECT * FROM dep;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare
         8 Lager

6 rader.

SQL> ROLLBACK 

ROLLBACK är utfört.

SQL> SELECT * FROM dep;

    DEP_PK DEP_NAME
---------- --------------------
         1 Ledningsgruppen
         2 Java-utveckling
         3 Microsoft-utveckling
         4 Arkitektgruppen
         5 Handläggare

5. SET TRANSACTION

Med detta kommando kan du ändra förutsättningarna för den innevarande transaktionen. Syntaxen är följande:
SET TRANSACTION {
	READ ONLY |
	READ WRITE |
	ISOLATION LEVEL SERIALIZEBLE |
	ISOLATION LEVEL READ COMMITTED |
	USE ROLLBACK SEGMENT segmentnamn
}	
[NAME transaktionsnamn]
Att man kan namnge transaktionen med NAME är nytt för 9i. Denna finess finns för att man lättare ska kunna övervaka transaktionerna. Man kan namnge transaktionen på detta sätt:
SQL> SET TRANSACTION NAME 'min transaction';

Transaktionen är angiven.

En transaktion är per default READ WRITE och ISOLATION LEVEL READ COMMITTED, alltså följande två anrop kommer inte att förändra transaktionen:
SQL> SET TRANSACTION READ WRITE;
Eller:
SQL> SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
Om man sätter transaktionen så att den blir READ ONLY tillåts inga förändringar i datat, se exempel:
SQL> SET TRANSACTION READ ONLY;

Transaktionen är angiven.

SQL> INSERT INTO dep VALUES(10,'Ha');
INSERT INTO dep VALUES(10,'Ha')
            *
Fel på rad 1:
ORA-01456: inte tillåtet att infoga/ta bort/uppdatera i en skrivskyddad
transaktion
Om man sätter transaktionen så att den får ISOLATION LEVEL SERIALIZABLE tvingar man transaktionen att rulla tillbaka om den påträffar ett LOCK.