Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.09;
Скачать: CL | DM;

Вниз

Работа БД с 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;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.21 c
14-1126749354
Ученик чародея
2005-09-15 05:55
2005.10.09
Почитал Орешник...


10-1105421249
Руслан
2005-01-11 08:27
2005.10.09
ExcelApplication


2-1125033635
syte_ser78
2005-08-26 09:20
2005.10.09
Как правильно рефрешить?


3-1124777864
SimKa
2005-08-23 10:17
2005.10.09
Удаление индексов


1-1126946533
testerr
2005-09-17 12:42
2005.10.09
скопировать экран TWebBrower