![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите [D7, MSSQL]
holod_new3 © (2006-01-13 10:05:00)Доброе утро!
Проблема состоит в следующем:
Есть таблица TUser. (поля ID_User, Name, Age) - это просто для примера.
Допустим, я хочу отредактировать запись из этой таблицы.
Нажимаю кнопочку Edit, в пишу Query1.ExecProc.В Query написан следующий код( Set TRANSACTION isolation level REPEATABLE READ Set Lock_Timeout 0 begin transaction select * from TUser) - транзакцию не закрываю, для наглядности этого примера.
Также есть кнопочка Delete(удаляет запись из TUser), в которой я пишу Query2.ExecProc (Delete From TUser Where ID_User=5) - 5-ая запись просто для примера!
Так вот, после нажатия кнопки Delete запись действительно удаляется из таблицы. Т.е. сервер не генерирует ошибку!!!
(Команды обе на сервер приходят.Проверял с помощью Profiler)
Если проделать подобные действия в QueryAnylazer,т.е В 1-й сессии пишем :
Set TRANSACTION isolation level REPEATABLE READ Set Lock_Timeout 0 begin transaction select * from TUser
во второй сессии пишем:
Delete From TUser
Where ID_User=5
То сервер генерирует ошибку :Ms 1222 ...и т.д. (и это правильно, так как 3-й уровень изоляции).
Но я не понимаю, почему Delphi не генерирует никаких ошибок!!!(или MSSQQL не генирирует). При любых конфликтных ситуациях транзакциях Delphi молчит и ничего не выдаёт!
Как сделать, чтобы вылетала ошибка! В идеале было бы, если ошибку генерировал MSSQL.
СПАСИБО, что прочитали ....
evvcom (2006-01-13 13:50:00) [1]
> Есть таблица TUser
Не... TUser не таблица, TUser - это ник одного из участников этого форума. :)
Fay (2006-01-13 13:21:00) [2]> Но я не понимаю, почему Delphi не генерирует никаких ошибок!!!
Сессия одна.
Ega23 (2006-01-13 11:38:00) [3]А... Не подумал. Действительно надо в разных окнах...
Nikolay M. (2006-01-13 11:11:00) [4]
> Ega23 © (13.01.06 10:40) [3]
> Проделал такую же фигню из QA - всё спокойно удалилось..
В одном окне QA:
CREATE TABLE tTest (ID INT)
INSERT INTO tTest
SELECT 1
UNION
SELECT 2
UNION
SELECT 3
UNION
SELECT 4
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
SET LOCK_TIMEOUT 0
BEGIN TRANSACTION
SELECT * FROM tTest
В другом:
DELETE FROM tTest WHERE ID = 3
Второе висит до тех пор, пока в первом открыта транзакция.
Nikolay M. (2006-01-13 11:02:00) [5]
> Desdechado © (13.01.06 10:42) [4]
Во-первых, Query1 может быть чем угодно, например, TEdit-ом :)
Во-вторых, я практически не работал с MS SQL через БДЕ, поэтому мне было бы интересно услышать о его роли в уровнях изоляции, если ISOLATION LEVEL задается явно в тексте запроса и контролируется непосредственно сервером.
Desdechado (2006-01-13 10:42:00) [6]судя по Query1, это БДЕ
он поддерживает не все уровни изоляции
Ega23 (2006-01-13 10:40:00) [7]Проделал такую же фигню из QA - всё спокойно удалилось...
Nikolay M. (2006-01-13 10:38:00) [8]
> Команды обе на сервер приходят.Проверял с помощью Profiler
Первая сессия, случайно, не рвется?
А если блокировку попробовать наложить в QA, а удалить из Дельфей? Если вывалится 1222-я ошибка (Lock Timeout), значит что-то с настройками соединения в Д. Кстати, что за компоненты используются и в какой связке?
Johnmen (2006-01-13 10:32:00) [9]Тема не оформлена. Очень много слов...
Отвечать не буду...:)