powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
6 сообщений из 6, страница 1 из 1
Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
    #39872513
Фотография Sergey_Korolev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ганс Христиан Андерсен."А король-то голый!"

Ниже, при упоминании документации используются

Database Concepts(DC)
https://docs.oracle.com/database/121/CNCPT/transact.htm#CNCPT016

Database Programmer's Guide to the Oracle Precompilers(DPG)
https://docs.oracle.com/database/121/ZZPRE/ch_seven.htm#ZZPRE734

В упражнениях 1 и 2 показано различное поведение при выполнении одинаковой последовательности действий
с транзакциями при проверке утверждения из DC

Changes made by the transaction are permanent and visible to other users only after a transaction commits.

Проверка проводилась на двух БД

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT * FROM v$version;

PDB
BANNER CON_ID
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for Linux: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0

non PDB
BANNER CON_ID
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for HPUX: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0



Состояние сессий\транзакций определялось запросом
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
  SELECT s.sid,
         s.serial#,
         s.username,
         s.machine,
         s.status,
         s.lockwait,
         s.LOGON_TIME,
         s.LAST_CALL_ET,
         t.XID            AS "txn id",
         t.NAME           AS "txn name", 
         t.XIDUSN         AS "undo seg",
         t.XIDSLOT        AS "slot",
         t.XIDSQN         AS "seq",
         t.STATUS         AS "txn status",
         t.START_TIME     "txn start_time"
    FROM v$transaction t INNER JOIN v$session s ON t.addr = s.taddr
ORDER BY t.start_time



Создаем тестовую таблицу

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
CREATE TABLE CUS_LOCK
(
  CUS  VARCHAR2(36 BYTE)
)
TABLESPACE USERS
PCTUSED    0
PCTFREE    10
INITRANS   1
MAXTRANS   255
STORAGE    (
            INITIAL          1M
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           )
LOGGING 
NOCOMPRESS 
NOCACHE
MONITORING;




Упражнение 1. Вставка в таблицу без индекса

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
-- First Session

SELECT ROWID, CUS FROM CUS_LOCK;
no rows selected.

SET TRANSACTION NAME 'First Transaction';

INSERT INTO CUS_LOCK (CUS)  VALUES ( 'ALTWCH');
1 row created.

SELECT ROWID, CUS FROM CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeDLAAA ALTWCH                              
1 row selected.

Первая транзакция не завершена(активна)

-- Second Session

SELECT ROWID, CUS FROM CUS_LOCK;
no rows selected.

SET TRANSACTION NAME 'Second Transaction';

INSERT INTO CUS_LOCK (CUS)  VALUES ( 'ALTWCH');
1 row created.

SID SERIAL# USERNAME MACHINE STATUS LOCKWAIT LOGON_TIME LAST_CALL_ET txn id undo seg slot seq txn status txn start_time     txn name
1333 13943       U_1 M1      INACTIVE  10/3/2019 08:05:11 110 0A000C00A2AD3800 10 12 3714466  ACTIVE     10/04/19 11:18:43  First Transaction 
1938 12803       U_2 M1      INACTIVE  10/3/2019 08:15:06 18 0900100013B71400  9  16 1357587  ACTIVE     10/04/19 11:22:21  Second Transaction 

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeCoAAA ALTWCH                              
1 row selected.

-- First Session Видит только свою запись
SELECT ROWID, CUS FROM COMOD.CUS_LOCK;
ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeDLAAA ALTWCH                              
1 row selected.

-- Second Session

COMMIT;
Commit complete.

SELECT * FROM CUS_LOCK;

SELECT ROWID, CUS FROM CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeCoAAA ALTWCH                              
1 row selected.

Вторая транзакции завершена Сессия видит только свою запись

-- First Session
SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeCoAAA ALTWCH                              
AAAgMmAM5AABeDLAAA ALTWCH                              

2 rows selected.


DELETE FROM COMOD.CUS_LOCK;
2 rows deleted. 

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;
no rows selected.

COMMIT;
Commit complete.

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

SELECT * FROM COMOD.CUS_LOCK;
no rows selected.

-- Second Session
SELECT ROWID, CUS FROM COMOD.CUS_LOCK;
no rows selected



Результат упражнения 1
Первая транзакция удалила данные, которых не было на момент ее начала.
Удаленные данные были вставлены второй транзакцией, которая началсь после первой и закончилась раньше.

Проверяемое
Changes made by the transaction are permanent and visible to other users only after a transaction commits.
выполнилось корректно, но вот

Определение transaction-level read consistency
взято из https://docs.oracle.com/database/121/CNCPT/glossary.htm#CNCPT89131

The guarantee of read consistency to all queries in a transaction.
Each statement in a transaction sees data from the same point in time, which is the time at which the transaction began.

нарушено явно.

Упражнение 2. То же, что 1 с уникальным индексом на таблице

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
CREATE UNIQUE INDEX CUS_LOCK_IDX ON COMOD.CUS_LOCK
(CUS)
LOGGING
TABLESPACE USERS
PCTFREE    10
INITRANS   2
MAXTRANS   255
STORAGE    (
            INITIAL          64K
            NEXT             1M
            MINEXTENTS       1
            MAXEXTENTS       UNLIMITED
            PCTINCREASE      0
            BUFFER_POOL      DEFAULT
           );
		   
Index created.	

Повторяем последовательность операций упражнения 1
-- First Session

SELECT ROWID, CUS FROM CUS_LOCK;
no rows selected.

SET TRANSACTION NAME 'First Transaction';

INSERT INTO COMOD.CUS_LOCK (CUS)  VALUES ( 'ALTWCH');
1 row created.

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeDLAAA ALTWCH                              
1 row selected.

-- Second Session

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;
no rows selected.

SET TRANSACTION NAME 'Second Transaction';
INSERT INTO COMOD.CUS_LOCK (CUS)  VALUES ( 'ALTWCH');

Сессия 2 зависла 

SID SERIAL# USERNAME MACHINE STATUS   LOCKWAIT         LOGON_TIME         LAST_CALL_ET txn id           undo seg slot seq txn status txn start_time     txn name
1333 13943  U1      M1      INACTIVE                   10/3/2019 08:05:11 146           01001000448B0100 1 16 101188           ACTIVE 10/04/19 12:27:37  First Transaction
1938 12803  U2      M1      ACTIVE    00000006639E9550 10/3/2019 08:15:06 20            0A000200B0AD3800 10 2 3714480          ACTIVE 10/04/19 12:30:09  Second Transaction 

-- First Session

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeDLAAA ALTWCH                              
1 row selected.

DELETE FROM COMOD.CUS_LOCK;
1 row deleted.

сессия 2 продолжает висеть

COMMIT;
Commit complete.

Сессия 2 отвисла
SID SERIAL# USERNAME MACHINE STATUS   LOCKWAIT LOGON_TIME LAST_    CALL_ET txn id           undo seg slot    seq txn status txn start_time     txn name
1938 12803  U2       M1      INACTIVE          10/3/2019  08:15:06 14      0A000200B0AD3800 10   2   3714480     ACTIVE     10/04/19 12:30:09  Second Transaction 

-- Second Session

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeCoAAA ALTWCH                              
1 row selected.

COMMIT;
Commit complete.
	 
Транзакция закрылась	 
	   
-- First Session

SELECT ROWID, CUS FROM COMOD.CUS_LOCK;

ROWID              CUS                                 
------------------ ------------------------------------
AAAgMmAM5AABeCoAAA ALTWCH                              
1 row selected.




Результат упражнения 2

Хотя 1-я транзакция была не завершена, вторая сессия не могла вставить данные до завершения 1-й трансакции.

Т.е. проверяемое условие видимости данных

Changes made by the transaction are permanent and visible to other users only after a transaction commits.

было нарушено.
...
Рейтинг: 0 / 0
Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
    #39872518
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolevбыло нарушено.Чудак, RTFM integrity constraints тщательней.
...
Рейтинг: 0 / 0
Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
    #39872520
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_KorolevТ.е. проверяемое условие видимости данных

Changes made by the transaction are permanent and visible to other users only after a transaction commits.

было нарушено.Какое именно изменение увидела другая транзакция и что она может предпринять на основании увиденного? Если дверь туалета заперта, это еще не значит, что там кто-то какает.
...
Рейтинг: 0 / 0
Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
    #39872526
maglevdevice
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Sergey_Korolev
Проверяемое
Changes made by the transaction are permanent and visible to other users only after a transaction commits.
выполнилось корректно, но вот

Определение transaction-level read consistency
взято из https://docs.oracle.com/database/121/CNCPT/glossary.htm#CNCPT89131

The guarantee of read consistency to all queries in a transaction.
Each statement in a transaction sees data from the same point in time, which is the time at which the transaction began.

нарушено явно.


Вам не кажется, что ссылка на глоссарий тут не к месту?
Не выполняется transaction-level read consistency, которого никто не обещал.
Такой режим можно включить через set transaction, по умолчанию поведение иное.
...
Рейтинг: 0 / 0
Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
    #39872551
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_Korolev
Код: plsql
1.
2.
3.
-- First Session

SET TRANSACTION NAME 'First Transaction';



Код: plsql
1.
SET TRANSACTION  isolation level serializable NAME 'First Transaction';


Наслаждайтесь.
...
Рейтинг: 0 / 0
Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
    #39872580
Фотография andrey_anonymous
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergey_KorolevОпределение transaction-level read consistency
взято из https://docs.oracle.com/database/121/CNCPT/glossary.htm#CNCPT89131

The guarantee of read consistency to all queries in a transaction.
Each statement in a transaction sees data from the same point in time, which is the time at which the transaction began.

нарушено явно.


Помимо словаря, следует почитать концепты, чтобы понять, как именно активируются те или иные механизмы и как они работают.
https://docs.oracle.com/database/121/CNCPT/consist.htm#GUID-D081389D-C338-4E74-BF64-6524795EF764
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Упражнения с транзакциями Oraсle. 1, 2 - различное поведение без и при наличии индекса.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]