Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / неатомарность SQL оператора UPDATE ? / 12 сообщений из 12, страница 1 из 1
04.09.2005, 13:09
    #33250290
неатомарность SQL оператора UPDATE ?
Пример:
Код: plaintext
1.
2.
3.
4.
CREATE  TABLE A_TEST (  A  INT NOT NULL UNIQUE);
INSERT INTO A_TEST VALUES( 1 );
INSERT INTO A_TEST VALUES( 2 );
INSERT INTO A_TEST VALUES( 3 );
Есть ли логичное обоснование, почему не работает следующий запрос:
Код: plaintext
1.
UPDATE A_TEST SET A = A +  1 
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того , как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?
...
Рейтинг: 0 / 0
04.09.2005, 13:31
    #33250309
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
В Oracle прекрасно работает
...
Рейтинг: 0 / 0
04.09.2005, 13:34
    #33250310
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
Код: plaintext
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.
SQL> create table abc(A number not null primary key);

Table created.

SQL> insert into abc(A)values( 1 );

 1  row created.

SQL> insert into abc(A)values( 2 );

 1  row created.

SQL> insert into abc(A)values( 3 );

 1  row created.

SQL> update abc set A=A+ 1 ;

 3  rows updated.

SQL> select * from ABC;

         A
----------
          2 
          3 
          4 

Полезно в вопросе уточнять СУБД
...
Рейтинг: 0 / 0
04.09.2005, 14:18
    #33250335
неатомарность SQL оператора UPDATE ?
Gluk (Kazan)Полезно в вопросе уточнять СУБД
Нда...
Не работает : PostgreSQL 8, Firebird 1.5, FirstSQL/J, Rel.
в HSQLDB 1.8 сработала даже вот такая фигня:
Код: plaintext
1.
 UPDATE A_TEST SET A = CASE WHEN A =  2  THEN  3  WHEN A =  3  THEN  2  ELSE A END;
Других БД под рукой пока нет :)
...
Рейтинг: 0 / 0
04.09.2005, 17:31
    #33250411
Абориген
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
В MSSQL нормально:
A
-----------
2
3
4
...
Рейтинг: 0 / 0
04.09.2005, 23:33
    #33250539
Lamer@fools.ua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
дураг с инецеативойПример:
Код: plaintext
1.
2.
3.
4.
CREATE  TABLE A_TEST (  A  INT NOT NULL UNIQUE);
INSERT INTO A_TEST VALUES( 1 );
INSERT INTO A_TEST VALUES( 2 );
INSERT INTO A_TEST VALUES( 3 );
Есть ли логичное обоснование, почему не работает следующий запрос:
Код: plaintext
1.
UPDATE A_TEST SET A = A +  1 
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того , как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?

А с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?
...
Рейтинг: 0 / 0
04.09.2005, 23:34
    #33250541
Lamer@fools.ua
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
Lamer@fools.uaА с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?

Тьфу. Торможу. Сорри.
...
Рейтинг: 0 / 0
05.09.2005, 09:36
    #33250739
AI
AI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
Lamer@fools.ua дураг с инецеативойПример:
Код: plaintext
1.
2.
3.
4.
CREATE  TABLE A_TEST (  A  INT NOT NULL UNIQUE);
INSERT INTO A_TEST VALUES( 1 );
INSERT INTO A_TEST VALUES( 2 );
INSERT INTO A_TEST VALUES( 3 );
Есть ли логичное обоснование, почему не работает следующий запрос:
Код: plaintext
1.
UPDATE A_TEST SET A = A +  1 
???

По ходу, для каждой обновляемой записи происходит проверка ограничений для таблицы, до того , как будут изменены остальные затронутые UPDATE'ом записи.
ИМХО, абсолютно алогичный подход, или это неприемлимо и в "чистой" РМД, или ткните мне носом в стандарты и мануалы, где такое поведение хотя бы оговаривается?

А с чего Вы взяли, что записи будут обновляться в той же последовательности, в которой они были добавлены?

Скорее, все проверки проходят, когда операция уже завершена. Например, из-за этого в оракле спокойно проходит каскадное обновление главных ключей с рекурсивными внешними (обновляется одна таблица), но не проходит обновление главных ключей, на которые ссылаются другие таблицы (можно, правда, обойтись триггерами). Оракл из-за такого поведения проверок может вообще отложить их (проверки) на момент commit.
...
Рейтинг: 0 / 0
09.09.2005, 13:21
    #33261171
Alexandr Kapustin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
Скажу за Sybase ASE. Думаю, что остальные СУБД, на которых это прокатывает, используют похожий механизм...

Для Sybase это называется deferred updates.
В этом случае update проходит в 3 стадии.
1. Отобрали записи, удовлетворяющие условиям в where, и поместили их в лог.
2. Физически удалили записи из таблицы
3. Вставили обновленные записи из лога в таблицу.

Так что проверки действительно происходят на последнем этапе, когда мы пачкой вставляем записи...

WBR, Alexandr
...
Рейтинг: 0 / 0
09.09.2005, 13:41
    #33261245
неатомарность SQL оператора UPDATE ?
ну, еще один механизм - deferred unique constraints, использует индексы, допускающие наличие неуникальных ключей (Oracle)
...
Рейтинг: 0 / 0
09.09.2005, 17:25
    #33261951
gardenman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
Код: plaintext
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.
connect to testdb user db2admin using         

   Database Connection Information

 Database server        = DB2/NT  8 . 2 . 2 
 SQL authorization ID   = DB2ADMIN
 Local database alias   = TESTDB

create table testunique ( id int not null unique )
DB20000I  The SQL command completed successfully.

insert into testunique values ( 1 ),( 2 ),( 3 )
DB20000I  The SQL command completed successfully.

commit
DB20000I  The SQL command completed successfully.

select * from testunique

ID         
-----------
           1 
           2 
           3 

   3  record(s) selected.


update testunique set id=id+ 1 
DB20000I  The SQL command completed successfully.

select * from testunique

ID         
-----------
           2 
           3 
           4 

   3  record(s) selected.


commit
DB20000I  The SQL command completed successfully.

...
Рейтинг: 0 / 0
09.09.2005, 17:58
    #33262031
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
неатомарность SQL оператора UPDATE ?
дураг с инецеативойну, еще один механизм - deferred unique constraints, использует индексы, допускающие наличие неуникальных ключей (Oracle)

Без надобности. В пределах одного оператора разруливается штатной версионнстью. Ограничения могут нарушаться в процессе выполнения оператора. Контролируются либо по завершении оператора, либо по завершении транзации (если проверка ограничений отложенная).
...
Рейтинг: 0 / 0
Форумы / Сравнение СУБД [игнор отключен] [закрыт для гостей] / неатомарность SQL оператора UPDATE ? / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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