powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Счетчик для версионника - как?
39 сообщений из 39, показаны все 2 страниц
Счетчик для версионника - как?
    #32845495
Дамир1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Прочитал статейку о том, что Юкон уже поддерживает версионность:
http://www.rsdn.ru/article/db/yukonvers.xml
и некоторую перебранку: http://www.sql.ru/forum/actualthread.aspx?tid=145611
Ув. гуру! просьба не издеваться, а дать решение для версионника простенькой задачки.
Сам я работаю с MSSQL2000 и плохо представляю как такое можно сделать на версионнике. Задачка простая - самодельный счетчик типа int.
Итак:
1) есть таблица счетчиков: create table Counters( CounterId int, CounterVal int )
2) есть таблица 'чего-нибудь' c PK, значение которого берется из Counters (с инкрементом): create AA( PK int, Attr char(10))

для блокировочника:

declare @n int
begin tran
update counters set CounterVal = CounterVal+1, @n = CounterVal where CounterId = 10

insert into AA select @n, 'Attrib'
commit

PS:
1) Про автоинкрементные поля я знаю, но у нас софт (чужой) работает именно так. Причем, счетчиков (дыже для одной таблицы АА может быть несколько).
2) Уровень изоляции подразумевается Read Commited, не желательно его менять.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845506
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А почему бы для этого не использовать генераторы уникальных последовательностей?
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845511
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
для этого существуют специальные объекты - sequence, автоинкрементных полей в оракле нет (ненужны).
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845515
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос который написал будет точно так же работать и на версионнике... потому что там изменение точно так же блокирует данные, как и на блокировочнике, чудес-то не бывает :)
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845518
Dik76
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!для этого существуют специальные объекты - sequence, автоинкрементных полей в оракле нет (ненужны).
То же самое и в InterBase... причем они работают вне контекста транзакции.
Интересно не появились ли sequence в юконе?
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845660
Дамир1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за живое участие!
2Серега, Yo!, Dik76 :
интересно, а в Юконе уже есть sequence? Если нет, то как-то странно получится: версионность поддерживают, а sequence нет....
В принципе, в MSSQL есть автоинкрементные поля и работают они тоже вне контекста транзакции. Но это не то... задачу изменять придется...

2 Alex.Czech: я сомневаюсь, что запрос будет работать так же - на то он и версионник. представьте, что вставка с одним значением счетчика идет не в 1 таблицу АА, a в 10 (т.е. достаточно длительная - пару секунд + с конкуренция с другими такими же транзакциями)
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845698
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Наверняка sequence в том или ином виде появятся в следующей версии СУБД от Microsoft и они как всегда назовут их "революционной технологией"
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845750
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Дамир1Спасибо за живое участие!
2Серега, Yo!, Dik76 :
интересно, а в Юконе уже есть sequence? Если нет, то как-то странно получится: версионность поддерживают, а sequence нет....
В принципе, в MSSQL есть автоинкрементные поля и работают они тоже вне контекста транзакции. Но это не то... задачу изменять придется...

2 Alex.Czech: я сомневаюсь, что запрос будет работать так же - на то он и версионник. представьте, что вставка с одним значением счетчика идет не в 1 таблицу АА, a в 10 (т.е. достаточно длительная - пару секунд + с конкуренция с другими такими же транзакциями)

Ну и что ? Произошел update - значит, строка в таблице заблокирована до конца транзакции. И это верно как в блокировочнике, так и в версионнике. Отличие в том, что ЧТЕНИЕ не блокирует данные, с записью никаких различий нет
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845756
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я очень сомневаюсь, что в MS SQL в ближайшее время появится sequence - там уже есть identity, ублюдочный, но аналог
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845758
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чем не нравится?

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845766
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
tygraА чем не нравится?


Чем не нравится identity ? Тем, что как это нередко бывает у MS, за меня многое решили Я могу использовать identity только для автоинкрементного значения в одной таблице, и все. Sequence по возможностям богаче, и хотя в 95% случаев этого не нужно, но зато в тех 5% когда занадобится, в MS SQL начинаются геморрои и всякие залипухи
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845781
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
значение SQUENCE я знаю до того, как начал транзакцию, а идентити - после
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845804
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть еще одна прикольная фича в Sybase ASE
Во всех базах данных timestamp - временная метка - просто тип данных, а тут...) все по особому...

create table #TTT (ts1 timestamp,ts2 timestamp)
go


Sybase ASE:
Server Message: Number 2738, Severity 16
Server 'pnsybase', Line 1:
A table can only have one timestamp column. Since table '#TTT_________00000770013300781' already has one, you can't add the column 'ts2'.

MSSQL:
Server: Msg 2738, Level 16, State 2, Line 1
A table can only have one timestamp column. Because table '#TTT' already has one, the column 'ts2' cannot be added.

db2 => connect to test3

Информация соединения с базой данных

Сервер баз данных = DB2/NT 8.2.0
ID авторизации SQL = DB2ADMIN
Алиас локальной базы данных = TEST3

db2 => create table ttt(ts1 timestamp,ts2 timestamp)
DB20000I Команда SQL выполнена успешно.
db2 =>
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845806
Alex.Czech
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В MS SQL то же самое с timestamp. Это на самом деле совсем не тот же timestamp что в Оракл или DB2, просто однофамилец :)
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32845935
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторзначение SQUENCE я знаю до того, как начал транзакцию, а идентити - после
А зачем вам до ? Привычки файл-серверного программирования о себе знать дают?

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32848922
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если задачу усложнить и вместо счетчика будет более сложная величина. Допустим текущие остатки по товару на складе? Я так понимаю тут sequence не поможет...
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32848950
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripА если задачу усложнить и вместо счетчика будет более сложная величина. Допустим текущие остатки по товару на складе? Я так понимаю тут sequence не поможет...
А если решать задачу обработки видео в реальном времени, то тут БД ваще не катит.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32848968
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quote]
А зачем вам до? Привычки файл-серверного программирования о себе знать дают?
[/quote]
Номер счета например видеть хорошо бы до сохранения.
Удобнее вставки подчиненных записей сразу же знать идентификатор родительской.
Потом, те же партишин-вью организовать не по int-полю, а по varchar, типа 1B,1C,1D, где B,C,D например - идентифицирует филиал (это когда репликация нужна). Про "достоинства" разеделения identity по диапазонам в mssql, надеюсь не нужно объяснять.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849011
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА если решать задачу обработки видео в реальном времени, то тут БД ваще не катит
Вообще-то конкретный вопрос был задан, а вы мне какую-то пургу. В Oracle я не специалист, потому и спрашиваю...
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849037
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CripВообще-то конкретный вопрос был задан, а вы мне какую-то пургу. В Oracle я не специалист, потому и спрашиваю...
Это ты пургу спросил. По твоему "текущие остатки по товару на складе" - это усложнение начальной задачи "счетчик"? ИМХО, это вообще другая задача. О ней недавно ветка была - http://]http://www.sql.ru/forum/actualthread.aspx?tid=145611
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849108
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторНомер счета например видеть хорошо бы до сохранения.
Зачем?
авторУдобнее вставки подчиненных записей сразу же знать идентификатор родительской.
Аналогично. Вставите родительскую - получите значение, тогда вставляйте подчиненные.


-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849168
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>>>Зачем?
Затем
>>>Аналогично. Вставите родительскую - получите значение, тогда вставляйте подчиненные
Я с клиента одним пакетом вставляю. А на клиенте, к примеру, два связанных датасета. И что я тогда в подчиненную запись подставлю для связи с родительской? -1? 0?
Правильно - GUID сгенерить на клиенте (это по поводу identity, так зачем мне он).
А гьюид разбалонсированный получается. Попробуй наверни на него партишин вью, наполнение партишин - непредсказуемо будет, количество партишин - постоянно (условия от A до Z), индексы на гьюид в таблицах - разбалансированы.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849454
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Каким пакетом? Что, не можете сначала вставить родительскую, потом дочерние с полученным значением? Ну странно.
Одним пакетом в две таблицы одновременно все-равно не вставить, как не старайся :)

В общем, это только отговорки и привычка - куча людей работает с identity, вставляет мастер-детайл и все хорошо получается. Потому я с тем же успехом могу сказать: как же вы это без identity работаете!!!??? Непорядок! :))

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849471
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
2tygra

а как можно было бы в моей задаче поступить. есть серификаты, там одна табличка, есть там id, cert_no, type. для различных типов своя нумерация начинающаяся с 1, у меня сейчас на каждый тип свой сиквенс, а как с автоинкрементом такое ?
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849520
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не знаю. Зачем им собственная нумерация? Странно как-то.

Ну я бы сделал через max(id)+1, если уж так нужно было бы. Но все же постарался бы сделать сквозную нумерацию.

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849523
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И с max(id)+1 было бы не хуже и не медленнее. А по действиям - то же самое, что селект сделать, что счетчик дернуть

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849538
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
>Не знаю. Зачем им собственная нумерация? Странно как-то.

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

>Ну я бы сделал через max(id)+1, если уж так нужно было бы.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849546
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
>Не знаю. Зачем им собственная нумерация? Странно как-то.

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

>Ну я бы сделал через max(id)+1, если уж так нужно было бы.

в смысле создать на каждый тип по левой табличке с автоинкрементом ? конечно выход ...
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849547
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2tygra
просто не люблю безпредметные споры. Ты уже со своими "зачем" половину топиков зафлеймил.
Тебе говоришь что удобнее так то, ты -что можно обойтись. Конечно можно, ничего нет невозможного.
Люди кучу примеров приводят где необходим/удобен sequence, а ты добрую половину из них игнорируешь.
Вот еще тебе пример: каждый год нумерация счетов/счет-фактур начинается заново. В оракловом сиквенсе это настраивается с пол пинка, наример.
Еще? - Два identity поля может в таблице существовать?
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849599
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпросто не люблю безпредметные споры. Ты уже со своими "зачем" половину топиков зафлеймил.
Если кто-то что-то делает, да еще говорит, что так и нужно, то уж наверное он должен объяснить, зачем это именно так :)
авторТебе говоришь что удобнее так то, ты -что можно обойтись. Конечно можно, ничего нет невозможного.
Кому удобнее? Вам? А мне нет - я вот и говорю, что можно обойтись и без этого. И без смертельных трюков. Если у вас в автомобиле есть педаль сцепления, а у меня нет (автомат), то это же не значит, что моя машина ущербнее :))
авторЛюди кучу примеров приводят где необходим/удобен sequence, а ты добрую половину из них игнорируешь.
Я не игнорирую, я говорю о том, что они там мне лично не нужны. Тем более, что их у меня и нет :). Это все-равно что спорить о том, у кого кнопки круглые, а у кого квадратные - у кого что есть, тот на том и работает. Я сниму шляпу, если вы на MS SQL сможете секвенсы использовать :)) А так - вы не умеете без секвенсов, а я умею :)
авторВот еще тебе пример: каждый год нумерация счетов/счет-фактур начинается заново. В оракловом сиквенсе это настраивается с пол пинка, наример.
Через select max буду делать. Или может быть вообще как-то по-другому все это настраивается. Я пока этим не занимался - других дел хватает. поэтому немогу сказать, как оно на самом деле работает.
авторЕще? - Два identity поля может в таблице существовать?
Нет. Ну и что? То, что два секвенса может быть, я знаю. И что? Из-за этого, которое еще и применяется в 0.05% случаев, громко кричать, что MS маст дай?

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

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849651
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!а как можно было бы в моей задаче поступить. есть серификаты, там одна табличка, есть там id, cert_no, type. для различных типов своя нумерация начинающаяся с 1, у меня сейчас на каждый тип свой сиквенс, а как с автоинкрементом такое ?
Хоть и не ко мне вопрос.
Я бы разделил ID и нумерацию (что обычно и делаю). ID - на сиквенс, нумерацию на max(id)+1 как вариант. Сиквенсы ведь все равно дыры делают.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849653
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
2tygra

select max() - это как я понимаю нада сначала единичку прибавить ... конечно решение интересное но годится для системы на 5-10 юзеров, когда идет речь о серьозных системах выстраивать всех в очередь ради того чтоб получить номерок неполучается ....
sequence же может раздавать номерки тысячам плюзователей с минимальной задержкой, т.к. это собственно основная его задача.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849677
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
>Я бы разделил ID и нумерацию (что обычно и делаю). ID - на сиквенс, нумерацию на max(id)+1 как вариант. Сиквенсы ведь все равно дыры делают.

max(id)+1 не получится, нужно по cert_no+1 причем для определеного типа или отдельный селект, но тогда это нужно делать отдельный селект в той же трнзакции а значит такие транзакции (с каждым типом) можно пускать только по очереди.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849740
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!max(id)+1 не получится, нужно по cert_no+1 причем для определеного типа или отдельный селект, но тогда это нужно делать отдельный селект в той же трнзакции а значит такие транзакции (с каждым типом) можно пускать только по очереди.
При "моей" схеме номера ты можешь присваивать хоть по ночам отдельным заданием по любому алгоритму. Для работоспособности системы - это фиолетово. Ссылки идут по ID, а номера они суть - справочные данные.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849762
Фотография Роман Дынник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забыл еще по поводу дыр...
Видел решение где пул id-шников выделяется. Пул хранится в отдельной таблице. Пользователь запрарашивает первый свободный id-шник, в этот момент проставляется признак что ид-шник занят. Если запись не сохраняется в базу, то ид-шник возвращается в пул.
Posted via ActualForum NNTP Server 1.1
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849768
Yo!
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Yo!
Гость
типа оператор вбивает, а распечатать с номером он сможет ночью :) тогда оператор очень быстро станет фиолетовым ...
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849789
Серега
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Yo!типа оператор вбивает, а распечатать с номером он сможет ночью :)
Типа читать надо внимательнее. " хоть ночью", это значит после фиксации ввода записей. Надо сразу - флаг в руки.
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32849825
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторselect max() - это как я понимаю нада сначала единичку прибавить ... конечно решение интересное но годится для системы на 5-10 юзеров, когда идет речь о серьозных системах выстраивать всех в очередь ради того чтоб получить номерок неполучается ....
Если есть соответствующий индекс, то никто и не заметит :))
Секвенс конечно побыстрее будет, но не на столько уж, чтобы все от счастья плакали :))

-- Tygra's --
...
Рейтинг: 0 / 0
Счетчик для версионника - как?
    #32916611
SV7
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SV7
Гость
tygra авторselect max() - это как я понимаю нада сначала единичку прибавить ... конечно решение интересное но годится для системы на 5-10 юзеров, когда идет речь о серьозных системах выстраивать всех в очередь ради того чтоб получить номерок неполучается ....
Если есть соответствующий индекс, то никто и не заметит :))
Секвенс конечно побыстрее будет, но не на столько уж, чтобы все от счастья плакали :))

-- Tygra's --

тогда Вам надо всю табличку заблокировать даже на чтение на время селекта и добавления записи с новым "максимальным" номером... а ну как у вас 100 юзеров изюм поштучно продают?...

ИМХО если необходимо делать нумерацию "без дыр" - то оптимально сделать табличку "нумераторов" для каждого типа документа и блокировать только одну запись, оставив в нормальном состоянии табличку документов
...
Рейтинг: 0 / 0
39 сообщений из 39, показаны все 2 страниц
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Счетчик для версионника - как?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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