powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разделить транзакцию
22 сообщений из 22, страница 1 из 1
Разделить транзакцию
    #32068798
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может кто-то имеет опыт работы с нарядами, извещениями и т.д. и т.п. Короче говоря, структура данных такова:
Код: plaintext
[исполнители]->---[наряд]---<-[работы]

(стрелочки - один ко многим)
Как проще и эффективнее организовать ввод данных для такой схемы?
1 вариант - по кусочкам. Т.е. формируется [наряд], затем к нему можно нарастить исполнителей и перечень работ. На каждую запись - отдельная транзакция.
2 вариант - все одной транзакцией (как по идее и должно быть). Все манипуляции с данными происходят на клиенте, а потом кэш сбрасываем в рамках одной транзакции. Но! все равно мы должны соблюдать последовательность ввода данных в базу. Т.е. нельзя сбросить данные об исполнителях, не имея там информации по наряду (что предусмотрено схемой базы).

Тем не менее, я выбрал 1 вариант. Конечно чистая бизнес-транзакция здесь как-таковая отсутствует. Однако есть преимущество во времени - снижается вероятность блокировок. Для модемной связи пакетная транзакция тем более не есть хорошо.
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32068952
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
м-да... рабочий день к концу подходит, похоже никто с OLTP сейчас не работает. всех 1С устраивает... надо переходить на OLAP :)
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32068972
Фотография mahoune
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я применял в такой ситуации один в один стакой подход! Отдельно создавался/изменялся наряд и работы! А потом по работам расписывали исполнителей! Очень удобно! Все это использовалось в автосервисе и тормозов замечено небыло!
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069371
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ерунда получается на клиенте. Для того чтобы откатить все изменения по одному наряду (нажав кнопку "Отмена") надо хранить либо перечень всех действий - изменение списка работ, исполнителей; либо... есть вариант все действия проводить в темповой табличке, а потом в рамках одной транзакции данные переносить в "нормальные" таблицы.



Как-то все мудрено. Может есть более простое решение? Как откатить действия при вводе данных в схеме один ко многим?
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069428
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
открыть еще одну сессию(со своей транзакцией..)....
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069486
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
гм... ну да. Так можно. Ну допустим завел пользователь 30 значений на один наряд. Т.е. будет 31 сессия. Берем 10 пользователей, т.е. 310 соединений на сервере? или что-то не так? :)
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069545
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не... есть еще вложенные транзакции...
ты детально алгоритм опиши(бизнес логику по шагам)
и где у тебя затык...
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069560
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну ладно. Попытка №2...
необходимо занести в базу данные по наряду. Вот примерный состав данных -

Наряд: дата, номер, подразделение. Суррогатный ключ identity.
Работы: операция, время, деньги.

На один наряд несколько работ.

С удалением нарядов проблем нет :) Есть проблемы с вставкой и обновлением. Какой-то тормоз здесь.

Допустим заводим новый наряд. Открывается на клиенте форма, указывает он номер, дату, подразделение, затем начинает вводить по работам. Как я могу занести данные по работам в таблицу, если еще нет ключевого поля по наряду?
Форма содержит внизу две кнопки - "OK" и "Отмена". Т.е. пользователь может откатить вообще все изменения при вводе наряда.
Завести одну транзакцию на ввод всей информации? Так она ведь заблокирует весь наряд! И длиться она может неопределенное количество времени.
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069576
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что мешает сначала вставить наряд а потом его наполнить ?
Не понял где возникает блокировка ?
Используй оптимистичные блокировки.

При открытии формы открывать соединение или начинать транзакцию по отмене роллбэк. Только отслеживать ошибку соединения (типа кто-то другой уже успел че то сделать с данными нового наряда) забивать болт или обрабатывать как надо и все .

Или нужно именно "неоптимистично" блокировать ?
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069595
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нельзя вставить пустой наряд. Он должен быть заполнен.

Если я буду изменять перечень работ по наряду в рамках одной транзакции, то при repeatableread эти данные будут заблокированы
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069606
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вопрос зачем здесь repeatableread
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069610
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы предлагаете грязное чтение?
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069615
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
зачем грязное? readcommitted
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069616
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на самом деле нужен ответ на вопрос зачем здесь repeatableread
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069624
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
что-то я не пойму...
открываю QA, делаю так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE TABLE [t_n] (
	[id_n] [int] NULL ,
	[name_n] [varchar] ( 50 ) NULL 
) 
GO

begin tran
insert into t_n (id_n, name_n)
values ( 1 , 'Hello')


открываю второе окно:
Код: plaintext
1.
2.
select * 
from t_n with (READCOMMITTED)

блокировано!
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069631
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
REPEATABLE READ конечно же моя ошибка
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069633
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все правильно ...
транзакция не закончена вставленные ряды эксклюзивно заблокированы
селект ждет
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069634
nandji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
при таком раскладе выход либо NOLOCK либо READPAST
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069641
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да-да. Грязное чтение. А READPAST наверняка лучше :)

Ладно. Буду пробовать. Вариант с транзакциями чем плох - продолжительное время удерживания ресурсов.
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069896
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нельзя вставить пустой наряд. Он должен быть заполнен.
почему так?
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069899
1077803
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тоже так думаю: что за ерунда, зачем городить себе сложности...

Наряд, как обычно, состоит из "шапки" и "строк детализации". Сначала создаем шапку (и прописываем в ней флаг "черновик", если уж очень хочется временно считать этот наряд недействительным), затем спокойненько, хоть в течение нескольких дней, дописываем строчки к этому наряду...

Абсолютно никаких проблем не вижу.
...
Рейтинг: 0 / 0
Разделить транзакцию
    #32069926
Фотография AVL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Mice: патамучто! :)
значение имеет не наряд, а выполненные работы.

Вместо метки "черновик" можно сделать к в банковском документообороте - состояние "закрыт/незакрыт". Соответственно всю дальнейшую работу (аналитику) проводить только с закрытым нарядом.

С другой стороны, если наряд блокирован транзакцией на изменение, то его, собственно, никто и не увидит. Так что может быть все получится и без дополнительного признака.

Посмотрим. Мне эту задачу необходимо реализовать в течении недели.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Разделить транзакцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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