Вопрос по App Dev Guide (рекомендация Оракла юзать ISOLATION LEVEL SERIALIZABLE)

GrayCity
Дата: 13.06.2006 01:45:26
Ora-10.2, Application Developer's Guide.pdf, страница 62, подраздел "Improving Transaction Performance".
Читаем следующее:
Писание, стр. 62
Consider the following performance enhancements when designing and
writing your application:
...
Use the SET TRANSACTION command with the ISOLATION LEVEL set to SERIALIZABLE to get ANSI/ISO serializable transactions.
Гуру, подскажите, плз, ЧЕМ именно улучшит производительность применение данного уровня изоляции, если при нём возможны отскоки назад при попытке обновить/удалить строки, которые были обновлены ПОСЛЕ старта такой транзации ? (ORA-08177: can't serialize access for this transaction).
---------------------------------------------------------------------------
И еще вопрос на эту же тему.
Открываем два сеанса, в первом делаем:
alter system set commit_write = nowait;
set transaction isolation level serializable;

Во втором:
update test set name='MARTA' where ID=250;

Возвращаемся в первый:
update test set name='VERA' where ID=250;

Здесь он наглухо зависает, т.к. идёт попытка изменить строку, которая была уже изменена вторым сеансом после старта первого (зависшего).
Идём во второй:
commit;

Только в этот момент в первом появляется ORA-08177.

ВОПРОС: что надо сделать, чтобы в первом сеансе (объявившем изоляцию = SERIALIZABLE) зависания вообще не было, т.е. чтобы он вывалился с этим сообщением СРАЗУ, до того, как во втором будет выполнен COMMIT ?
Падонак
Дата: 13.06.2006 02:19:13
1. то что транзакцыя виснет - уровень ее изоляции не при чем
то жесамое будет делаться при read committed

2. с чего она должна вылетать, если ты во второй сесси можешь откатиться?

3. кажется, Вы как-то неверно истолковали "commit_write = nowait;"
к поведению транзакции это не имеет отношения

4. чтобы не висло на блокировке, можно, например, сделать for update

5.
>> ЧЕМ именно улучшит производительность применение данного уровня изоляции
Где написано, в вашей цитате доки в том числе, что serializable увеличит производительность?
Падонак
Дата: 13.06.2006 02:58:29
>> for update
for update nowait
Stax.
Дата: 13.06.2006 09:41:48
Падонак

2. с чего она должна вылетать, если ты во второй сесси можешь откатиться?

может и вылетать, напр

08:36:20 SES1> set transaction isolation level serializable;

Transaction set.

08:36:24 SES1> update t set d=1 where b=30;
update t set d=1 where b=30
Ждем, "правильно" слетели во второй коммит
*
ERROR at line 1:
ORA-08177: не могу преобразовать в последов.доступ для этой транзакции


08:37:00 SES1> update t set d=1 where b=30;
update t set d=1 where b=30
Ждем, "не правильно" слетели во второй роллбек
*
ERROR at line 1:
ORA-08177: не могу преобразовать в последов.доступ для этой транзакции
08:37:17 SES1> 
вторая
08:36:30 SES2> update t set d=1 where b=30;

1 row updated.

08:36:50 SES2> commit;

Commit complete.

08:37:00 SES2> update t set d=1 where b=30;

1 row updated.

08:37:07 SES2> rollback;

Rollback complete.

08:37:17 SES2> 
GrayCity
Дата: 13.06.2006 09:42:53
Падонак
Где написано, в вашей цитате доки в том числе, что serializable увеличит производительность?

Смотрим еще раз (стр. 62 App. Developer's Guide.pdf, 10.2):
==============================================
Consider the following performance enhancements when designing and
writing your application:
...
Use the SET TRANSACTION command with the ISOLATION LEVEL set to SERIALIZABLE to get ANSI/ISO serializable transactions.

Я неправильно истолковал слова "performance enhancements" ?
waspwort
Дата: 13.06.2006 10:11:25
GrayCity
alter system set commit_write = nowait;


http://download-uk.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams027.htm#REFRN10260
COMMIT_WRITE is an advanced parameter used to control how redo for transaction commits is written to the redo logs. The IMMEDIATE and BATCH options control how redo is batched by Log Writer. The WAIT and NOWAIT options control when the redo for a commit is flushed to the redo logs.
waspwort
Дата: 13.06.2006 10:13:23
GrayCity

Я неправильно истолковал слова "performance enhancements" ?


ИМХО - это значит "расширение функциональности", а не "увеличение производительности"
from far-far away
Дата: 13.06.2006 14:15:04
waspwort
GrayCity

Я неправильно истолковал слова "performance enhancements" ?


ИМХО - это значит "расширение функциональности", а не "увеличение производительности"

performance == производительность in this context
Александр Соколов
Дата: 13.06.2006 15:13:06
GrayCity
Ora-10.2,
Писание, стр. 62
Consider the following performance enhancements when designing and
writing your application:
...
Use the SET TRANSACTION command with the ISOLATION LEVEL set to SERIALIZABLE to get ANSI/ISO serializable transactions.
Гуру, подскажите, плз, ЧЕМ именно улучшит производительность применение данного уровня изоляции, если при нём возможны отскоки назад при попытке обновить/удалить строки, которые были обновлены ПОСЛЕ старта такой транзации ? (ORA-08177: can't serialize access for this transaction).

Вот как этот фрагмент выглядит в переводе:
...
Кроме определения типа операций, включаемых в транзакцию, при разра-
ботке приложения следует также рассмотреть способы повышения ее произво-
дительности.
...
Для настройки сериализации транзакций в соответствии со стандартом
ANSI/ISO используйте оператор SET TRANSACTION, задав параметру
ISOLATION LEVEL значение SERIALIZABLE.

Вот что по этому поводу пишет Том Кайт:
Том Кайт
Сервер Oracle Database придерживается при обеспечении сериализуемости оптимистического подхода; он предполагает, что данные, которые потребуется обновлять вашей транзакции, не будут обновляться другими транзакциями. Обычно именно так и происходит, и подобное предположение вполне оправдано, особенно в быстрых транзакциях, OLTP-системах. Если во время транзакции ваши данные не изменяются другими сеансами, этот уровень изоляции, обычно снижающий степень параллелизма в других системах, обеспечит ту же степень параллелизма, что и при отсутствии транзакций с таким уровнем изоляции. Вопрос лишь в том, не получите ли вы сообщения об ошибке ORA-08177, если предположение не оправдается. Однако поразмыслив, можно найти такой риск оправданным. Если вы используете транзакции с уровнем изоляции SERIALIZABLE, вы не ожидаете изменения одной и той же информации другими транзакциями.
Если же это возможно, следует использовать оператор SELECT ... FOR UPDATE, как было описано в главе 1 [книги Expert Oracle Database Architecture: 9i and 10g Programming Techniques and Solutions]. Он будет сериализовать доступ. Итак, уровень изоляции SERIALIZABLE дает хороший эффект, если:
· высока вероятность того, что данные не модифицируют другие сеансы;
· необходима согласованность чтения на уровне транзакций;
· транзакции будут непродолжительными (чтобы первое условие стало более реальным).
waspwort
Дата: 13.06.2006 15:20:56
from far-far away

performance == производительность in this context


в этом

http://download-east.oracle.com/docs/cd/B19306_01/appdev.102/b14251/adfns_sqlproc.htm#sthref298
Both Oracle Database isolation modes provide high levels of consistency and concurrency (and performance) through the combination of row-level locking and Oracle Database's multi-version concurrency control system. Because readers and writers do not block one another in Oracle Database, while queries still see consistent data, both READ COMMITTED and SERIALIZABLE isolation provide a high level of concurrency for high performance, without the need for reading uncommitted ("dirty") data.


контексте пожалуй, да