Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопросы: / 14 сообщений из 14, страница 1 из 1
24.11.2006, 16:36
    #34154275
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Вопрос№1:
мне дали задание по DB2:
(выполняется при помощи 2-х экземпляров приложения Command Center, моделирующих конкурирующие транзакции Т1 и Т2)
Выполнить в транзакции T1 запрос из таблицы "Сотрудники" с уровнем изоляции CS. Изменить одну из записей таблицы "Сотрудники" из транзакции Т2. Подтвердить транзакцию Т2, после чего вновь выполнить запрос из таблицы "Сотрудники" в транзакции Т1 с уровнем изоляции CS. Завершить транзакцию T1.Объяснить результат.
а)Выполнить в транзакции T1 запрос из таблицы "Сотрудники" с уровнем изоляции CS:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * from employers with cs

CODE        FIO                   DEPATMENT                        AGE        
----------- -------------------- -------------------- -----------
         123  Иванов                Работа с клиентами             25 
         124  Петров                Маркетинг                          27 
         125  Сидоров              Планирование                     35 
         126  Липовах              менеджмент                        42 

   4  записей выбрано.
б)Изменить одну из записей таблицы "Сотрудники" из транзакции Т2:

Код: plaintext
1.
update employers set depatment='менеджмент2' where code= 126 
DB20000I  Команда SQL выполнена успешно.
в)Подтвердить транзакцию Т2:

Код: plaintext
1.
commit
DB20000I  Команда SQL выполнена успешно.
г)выполнить запрос из таблицы "Сотрудники" в транзакции Т1 с уровнем изоляции CS:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select * from employers with cs

CODE        FIO                  DEPATMENT            AGE        
----------- -------------------- -------------------- -----------
         123  Иванов                Работа с клиентами             25 
         124  Петров                Маркетинг                          27 
         125  Сидоров              Планирование                     35 
         126  Липовах              менеджмент2                      42 

   4  записей выбрано.
д)Завершить транзакцию T1:
Код: plaintext
1.
commit
DB20000I  Команда SQL выполнена успешно.
Как объяснить результат? Для чего всё это? Что в конце концов мы получили? Или тут что-то не так?
...
Рейтинг: 0 / 0
24.11.2006, 16:50
    #34154325
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Вопрос №2:
как запускать курсор с оператором FOR UPDATE:
Код: plaintext
1.
declare curs1 cursor for update employers set age=age+ 2 
DB20000I  Команда SQL выполнена успешно.
...
Рейтинг: 0 / 0
24.11.2006, 16:58
    #34154360
НГ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
а Вы в Command Center autocommit отключили?
...
Рейтинг: 0 / 0
24.11.2006, 17:18
    #34154454
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
где это? что-то не нашёл. на какой вкладке?
...
Рейтинг: 0 / 0
24.11.2006, 17:34
    #34154493
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Это "Автоматически запускать локальную систему DB2 при запуске инструментов"?
...
Рейтинг: 0 / 0
24.11.2006, 17:47
    #34154544
NewYear
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Инструменты-> параметры инструментов-> редактор команд.
галочка Автоматическое принятие операторов эскуэль доллжна бать снята.

Неважно.

db2 9.1.0 356
Уровень конпиляции s060629

в джавяном контрол центре.

connect to xx
create table xx ( xx char(10))
commit
insert into xx values( 'xx')
select * from xx <-- здесть висним видимо на блокировке(не дождался).
commit



не пользуйтесь Сontrol Center!
...
Рейтинг: 0 / 0
24.11.2006, 19:23
    #34154762
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Вопрос №1:

Все отработало так, как и ожидалось.
И не важно, был автокоммит включен или нет, в данном случае эти 2 транзакции ни за что не конкурируют:
При чтении с уровнем изоляции CS мы блокируем только ту строку, на которой позиционирован курсор в данный момент.
Приложения же обычно, чтоб вернуть результат запроса, делают так:
1. Посылают запрос.
2.
Получив курсор, прокручивают его до конца и показывают результат клиенту.
При этом указатель курсора в конце чтения будет располагаться за последней записью.

Т.е. T1, прочитав все записи, не будет блокировать строк.
Т2 после этого сделает update и закоммитится. Никто ей не мешает.
T1 после этого читает изменившееся значение и коммитится. Никто ей не мешает.

Вот если бы command center (T1) решил бы остановиться на какой-нибудь записи и не прокручивать курсор дальше, то эту запись не смогла бы обновить T2.
Тоже самое произошло бы, если бы T1 работала бы с RS (RR).

Вопрос №2:

DECLARE C1 CURSOR FOR
SELECT *
FROM EMPLOYERS
FOR UPDATE OF AGE
...
Рейтинг: 0 / 0
24.11.2006, 19:50
    #34154800
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Как потом с помощью этого курсора производить изменения в таблице? Например, с помощью курсора увеличить возраст на 3?
...
Рейтинг: 0 / 0
27.11.2006, 10:35
    #34156856
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Код: 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.
create procedure tst()
language sql
begin atomic
 declare at_end int;
 declare a int;
 declare c1 cursor for 
   select age
   from employers
--where <условие_выборки>
   for update of age;
 declare continue handler for sqlstate '02000' set at_end= 1 ;

 open c1;
 set at_end= 0 ;
 fetch c1 into a;
 while (at_end= 0 ) do
   update employers
   set age=age+ 3 
   where current of c1;
   set at_end= 0 ;
   fetch c1 into a;
 end while;
close c1;
end@
...
Рейтинг: 0 / 0
27.11.2006, 10:58
    #34156942
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Попытался создать процедуру, получилось следующее:
Код: 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.
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.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
------------------------------ Введенные команды ------------------------------
create procedure tst()
language sql
begin atomic
 declare at_end int;
 declare a int;
 declare c1 cursor for 
   select age
   from employers
--where <условие_выборки>
   for update of age;
 declare continue handler for sqlstate '02000' set at_end= 1 ;

 open c1;
 set at_end= 0 ;
 fetch c1 into a;
 while (at_end= 0 ) do
   update employers
   set age=age+ 3 
   where current of c1;
   set at_end= 0 ;
   fetch c1 into a;
 end while;
close c1;
end;
------------------------------------------------------------------------------
create procedure tst()
language sql
begin atomic
declare at_end int
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "c 
declare at_end int".  Список правильных элементов: "<psm_semicolon>".  LINE 
NUMBER= 4 .  SQLSTATE= 42601 

declare a int
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "int" после текста "declare a ".  
Список правильных элементов: "END-OF-STATEMENT".  SQLSTATE= 42601 

declare c1 cursor for select age from employers for update of age
DB20000I  Команда SQL выполнена успешно.

declare continue handler for sqlstate '02000' set at_end= 1 
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "declare CONTINUE handler for 
sqlstate" после текста "BEGIN-OF-STATEMENT".  Список правильных элементов: 
"<create_proc>".  SQLSTATE= 42601 

open c1
DB20000I  Команда SQL выполнена успешно.

set at_end= 0 
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "at_end" после текста "set ".  Список 
правильных элементов: "JOIN <joined_table>".  SQLSTATE= 42601 

fetch c1 into a
SQL0104N  Обнаружен неправильный элемент "into" после текста 
"<идентификатор>".  Список правильных элементов: "END-OF-STATEMENT".  
SQLSTATE= 42601 

while (at_end= 0 ) do update employers set age=age+ 3  where current of c1
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "while (at_end=0) do" после текста 
"BEGIN-OF-STATEMENT".  Список правильных элементов: "<space>".  SQLSTATE= 42601 

set at_end= 0 
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "at_end" после текста "set ".  Список 
правильных элементов: "JOIN <joined_table>".  SQLSTATE= 42601 

fetch c1 into a
SQL0104N  Обнаружен неправильный элемент "into" после текста 
"<идентификатор>".  Список правильных элементов: "END-OF-STATEMENT".  
SQLSTATE= 42601 

end while
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "end 
while".  Список правильных элементов: "JOIN <joined_table>".  SQLSTATE= 42601 

close c1
DB20000I  Команда SQL выполнена успешно.

end
DB21034E  Данная команда обрабатывалась как оператор SQL, поскольку она не 
является допустимой командой процессора командной строки.  При обработке SQL 
было получено сообщение:
SQL0104N  Обнаружен неправильный элемент "END-OF-STATEMENT" после текста 
"end".  Список правильных элементов: "JOIN <joined_table>".  SQLSTATE= 42601 

SQL0104N  Обнаружен неправильный элемент "END-OF-STATEMENT" после текста "end".  Список правильных элементов: "JOIN <joined_table>                              ".

Объяснение: 

Обнаружена синтаксическая ошибка в операторе SQL, где указанный 
элемент следует после текста "<текст>".  В поле "<текст>" 
показаны  20  символов оператора SQL непосредственно перед неверным 
элементом.  

 В качестве подсказки программисту поле SQLERRM области SQLCA 
содержит частичный список правильных элементов в виде 
"<список-элементов>".  При составлении этого списка 
подразумевается, что предыдущая часть оператора не содержит 
ошибок.  

 Оператор невозможно обработать.  

Действия пользователя: 

Проверьте и исправьте оператор в области указанного элемента.  

 sqlcode :  - 104  

 sqlstate :   42601  
...
Рейтинг: 0 / 0
27.11.2006, 11:07
    #34156983
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Установите statement termination character (кажется так) в вашем command center вместо ';' в '@'.
...
Рейтинг: 0 / 0
27.11.2006, 12:30
    #34157343
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Всё, спасиб, получилось!
...
Рейтинг: 0 / 0
01.12.2006, 10:53
    #34169546
Bean
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
Как создать пользователя БД?
Написано:
В Центре управления раскрывайте дерево объектов, пока не найдете папку Пользователи баз данных .

Щелкните правой кнопкой по папке Пользователи баз данных и из всплывающего меню выберите Создать . Откроется записная книжка Создать пользователя базы данных.

Но проблема в том, что в дереве объектов в центре управления нет папки Пользователи баз данных. Есть только:

таблицы

производные таблицы

триггеры

объекты программ,
в которых:

Пользовательские ф-и

хранимые процедуры
...
Рейтинг: 0 / 0
02.12.2006, 12:09
    #34172267
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопросы:
В моём Control Center искомые User and Group Objects находятся как раз между Application Objects и Federation Database Objects. Быть может, у вас версия стара?

Но всё равно, на самом-то деле юзера создаются не там, а в операционной системе.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Вопросы: / 14 сообщений из 14, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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