Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Вниз

Работа БД с MS SQL, что лучше?   Найти похожие ветки 

 
_sulent   (2005-08-23 07:36) [0]

Приветствую!
У меня вопрос такого характера. Работаю с MSSQL через ADO и получается очень неприятная история. Сколько уже бьюсь никак не получается от нее отвязаться.
Допустим программа работает по сети, и если один клиент выполняет запрос на добавление, а второй делает select, то как бы все нормально происходит с добавлением, транзакция вроде как завершается, но... база блокируется. Т.к. говорит что мол таблицы заблокированы, типа до конца не завершился insert. Хотя commit прошел, может есть какая-то тонкость в этом деле?
Что только не пробовал, и через параметры, и даже PAGLOCK, но толку никакого.

Заранее благодарен


 
sniknik ©   (2005-08-23 08:32) [1]

> ... типа до конца не завершился insert. Хотя commit прошел ...
т.е. разовое применение добавления в транзакции блокирует дальнейшую работу? (commit прошел). ну это у тебя наверное ошибка в программе.

а тонкости да есть (а где их нет?), делать только "короткие" транзакции (если нужно готовить данные заранее, не "размазывать" ее стартуя а после ожидая чегото), "заворачивать" в транзакцию только то что необходимо (связанные логически данные, блок данных, в общеv то что одно без другого смысла не имеет ), не пользоваться тразакциями для реализации кнопки "отмена" (пример даже такой в книге видел... но так то пример, а воспринимают буквально, типа так надо), работать с транзакциями командами mssql сервера а не компонент (здесь чистое имхо, т.к. много проблем видел именно с компонентной реализацией которые в "секунд" решались заменой на вызов команды сервера... с чем связано, от чего зависит х.з. т.к. в этом случае (MSSQL) они должны быть равнозначны), и т.д. на маленькую брошурку страниц на 18 мелким шрифтом "тонкостей"... все и не вспомнить, только когда конкретная ситуация разбирается можно сказать... "а вот тут есть одна тонкость" ;о)).

p.s. самое главное забыл, не пользоваться обшими фразами при описании проблемы!!! (та еще "тонкость" ;), типа "... но толку никакого". это лучше заменить на конкретный код с пояснениями а последние слова сообшением ошибке/описанием неправильности (в твоем понимании) действия. и как оно должно быть правильно (опять в твоем понимании).


 
_sulent   (2005-08-23 08:52) [2]

Спасибо, учту в следующий раз!
Да и транзакции выполняются уже с собранными данными, и пролетает она довольно быстро. 1 до 3 сек.
И какого рода может быть ошибка в программе? Какие явные причины могут этому послужить?


 
Anatoly Podgoretsky ©   (2005-08-23 08:59) [3]

_sulent   (23.08.05 08:52) [2]
Количество возможных ошибок превосходит человеские фантазии. Количество партизан среди программистов превосходит средний уровень.


 
_sulent   (2005-08-23 09:15) [4]

Ответ есть ответ, но он ни капельки не помогает в решении той или иной проблемы. Я спрашиваю про наиболее вероятные, из учета которых можно будет судить о правильности построения кода.
Просто я взялся переписывать все полностью, и хочу учесть все возможные варианты, чтобы потом не было мучительно больно!


 
_sulent   (2005-08-23 09:18) [5]

и еще вдобавок. После insert"a делаешь сразу select, то выдается что запись не найдена, а коммит уже прошел. И причем такое случается не всегда. Иногда проходит нормально. Такое впечателение складывается, что запись еще не успела создаться, а он пытается делать выборку. Такая же беда случается и с созданием временных таблиц.


 
Layner ©   (2005-08-23 09:36) [6]

_sulent   (23.08.05 09:18)
GO - Добавлять, точно увидишь SELECT. Правда в ADO ошибка выскочит на синтаксис.


 
Fay ©   (2005-08-23 09:48) [7]

2 Layner ©   (23.08.05 9:36) [6]
Чушь


 
Layner ©   (2005-08-23 09:58) [8]

GO
Завершает все не выполненные команды, какая чушь? Если в QA написать, ошибки не будет, если написать в запросе на INSERT в ADOQuery, и в конце GO написать, запрос не выполнится, выскочит ошибка в синтаксисе.


 
MOA ©   (2005-08-23 10:10) [9]

1. Не используются ли хинты в селектах/инсертах?
2. Не поставлен ли "суровый" уровень изоляции транзакций - SERIALIZABLE, например?
Удачи!


 
alex_***   (2005-08-23 10:11) [10]

а если посмотреть счетчик транзакций?


 
sniknik ©   (2005-08-23 10:16) [11]

> После insert"a делаешь сразу select, то выдается что запись не найдена, а коммит уже прошел. И причем такое
> случается не всегда.
впечатление от "выдавленной" капли информации такое - в программе не используется ADOConnection..., а созданные автоматически над каждым компонентом конекты используют буферизацию, у каждого своя... следующий селект просто не видит данные еще не сохраненные из соседнего буфера... то что иногда всетаки срабатывает, говорит либо о том что ком быстрый, либо селекты делаются неравномерно (те что с задержкой работают).
еще возможно (как вариант и не единственный) используются асинхронные запросы... они естественным образом в разных потоках выполняются и поэтому возможно выполнение следующего до завершения предыдущего. (если по коду в дельфи смотреть)

Anatoly Podgoretsky ©   (23.08.05 08:59) [3]
а не сделать ли специальный значек "партизан"... ;о)), чтобы быть готовым к типу "общения", либо игнорировать вопросы от них.


 
Fay ©   (2005-08-23 11:02) [12]

2 Layner ©   (23.08.05 9:58) [8]
>> Завершает все не выполненные команды
Чушь.
>> запрос не выполнится, выскочит ошибка в синтаксисе
Удивительно!


 
sniknik ©   (2005-08-23 11:10) [13]

Fay ©   (23.08.05 11:02) [12]
он имеет ввиду, что GO это команда самого QA а не MSSQL

правда я не понял к чему он это сказал, вроде никакого указания на то что автором вопроса выполняются запросы в QA не было... и потом, там тоже парные селект/инсерт вполне работают и в одном блоке.


 
Fay ©   (2005-08-23 11:25) [14]

2 sniknik ©   (23.08.05 11:10) [13]

Допустим, я тоже типа понял, что имелось ввиду...
Но скажите, Вы в состоянии представить себе "не выполненные команды" и их "завершение" с помощью GO?


 
_sulent   (2005-08-23 11:34) [15]

AdoConnection я естесственно использую иначе я просто не прставляю нормальной работы транзакций. IsolationLavel у меня стоит ilReadCommitted. Делаю приблизительно такую штуку:

// собираю запросы
try
adoconnection1.begintrans;
query1.execsql;
query2.execsql;
...
queryn.open;//select
adoconnection1.commit;
except
...
adoconnection1.rollbakack;
end;


 
sniknik ©   (2005-08-23 11:35) [16]

> Вы в состоянии представить себе "не выполненные команды" и их "завершение" с помощью GO?
вполне. ;о))
но мое представление это не то что есть в действительности (хотя и это возможно). ;о)

к примеру блок команд (до GO) выполняется в асинхронном режиме, GO это команда ожидания завершения работы этого блока. (естественно это не с помощью а с использованием... но можно списать на корявость изложения)


 
sniknik ©   (2005-08-23 11:38) [17]

> Делаю приблизительно такую штуку:
а ответы читаеш? и пытаешся проверить... или ты их коллекционируеш?

если читаеш и пробуеш то перечитай и перепробуй первый ([1]) пост.


 
_sulent   (2005-08-23 11:49) [18]

Пробую и пытаюсь, только лента уже развилась не на первоначальной проблеме, а привязалась к QA. Там это безпроблем делается. Учитываю все высказывания и предложения. Но последние посты, они мне как-то не особенно помогают.
Когда я выполняю эту беду на своем компе, без клиентов, нормально.
Теперь из учета всего сказанного я понял приблезительно что нужно делать и, самое главное, как...

Спасибо что не отказали в трудный момент!


 
Ольга   (2005-08-23 14:48) [19]


>  [15]  queryn.open;//select

Это зачем присутствует в транзакции?


 
_sulent   (2005-08-24 12:09) [20]

я ошибся, этого не присутсвует :)


 
АлексейК   (2005-08-25 12:57) [21]

try
adoconnection1.begintrans;
query1.execsql;
query2.execsql;
...
queryn.open;//select
adoconnection1.commit;
except
...
adoconnection1.rollbakack;
end;


Интересно, а что должен вернуть запрос queryn?



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2005.10.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.014 c
2-1125050340
Fay
2005-08-26 13:59
2005.10.09
Что такое $ALIGN ваще и $ALIGN 8 в частности


6-1118748923
atmospheric
2005-06-14 15:35
2005.10.09
Отправка сообщения конкретному клиенту?


14-1126986860
Мексиканец
2005-09-17 23:54
2005.10.09
Заметил странный факт


1-1127201618
Barloggg
2005-09-20 11:33
2005.10.09
Какой вызов процедуры быстрее?


1-1127126173
Николай1
2005-09-19 14:36
2005.10.09
TreeView назначить событие на конкретный узел





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский