Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Добрый день. Прочитал статейку о том, что Юкон уже поддерживает версионность: 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, не желательно его менять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 10:29 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
А почему бы для этого не использовать генераторы уникальных последовательностей? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 10:37 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
для этого существуют специальные объекты - sequence, автоинкрементных полей в оракле нет (ненужны). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 10:39 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Запрос который написал будет точно так же работать и на версионнике... потому что там изменение точно так же блокирует данные, как и на блокировочнике, чудес-то не бывает :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 10:41 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Yo!для этого существуют специальные объекты - sequence, автоинкрементных полей в оракле нет (ненужны). То же самое и в InterBase... причем они работают вне контекста транзакции. Интересно не появились ли sequence в юконе? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 10:42 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Спасибо за живое участие! 2Серега, Yo!, Dik76 : интересно, а в Юконе уже есть sequence? Если нет, то как-то странно получится: версионность поддерживают, а sequence нет.... В принципе, в MSSQL есть автоинкрементные поля и работают они тоже вне контекста транзакции. Но это не то... задачу изменять придется... 2 Alex.Czech: я сомневаюсь, что запрос будет работать так же - на то он и версионник. представьте, что вставка с одним значением счетчика идет не в 1 таблицу АА, a в 10 (т.е. достаточно длительная - пару секунд + с конкуренция с другими такими же транзакциями) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 11:40 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Наверняка sequence в том или ином виде появятся в следующей версии СУБД от Microsoft и они как всегда назовут их "революционной технологией" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 11:52 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Дамир1Спасибо за живое участие! 2Серега, Yo!, Dik76 : интересно, а в Юконе уже есть sequence? Если нет, то как-то странно получится: версионность поддерживают, а sequence нет.... В принципе, в MSSQL есть автоинкрементные поля и работают они тоже вне контекста транзакции. Но это не то... задачу изменять придется... 2 Alex.Czech: я сомневаюсь, что запрос будет работать так же - на то он и версионник. представьте, что вставка с одним значением счетчика идет не в 1 таблицу АА, a в 10 (т.е. достаточно длительная - пару секунд + с конкуренция с другими такими же транзакциями) Ну и что ? Произошел update - значит, строка в таблице заблокирована до конца транзакции. И это верно как в блокировочнике, так и в версионнике. Отличие в том, что ЧТЕНИЕ не блокирует данные, с записью никаких различий нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:11 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Я очень сомневаюсь, что в MS SQL в ближайшее время появится sequence - там уже есть identity, ублюдочный, но аналог ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:13 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
А чем не нравится? -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:15 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
tygraА чем не нравится? Чем не нравится identity ? Тем, что как это нередко бывает у MS, за меня многое решили Я могу использовать identity только для автоинкрементного значения в одной таблице, и все. Sequence по возможностям богаче, и хотя в 95% случаев этого не нужно, но зато в тех 5% когда занадобится, в MS SQL начинаются геморрои и всякие залипухи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:17 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
значение SQUENCE я знаю до того, как начал транзакцию, а идентити - после ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:22 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
есть еще одна прикольная фича в 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 => ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:30 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
В MS SQL то же самое с timestamp. Это на самом деле совсем не тот же timestamp что в Оракл или DB2, просто однофамилец :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 12:31 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
авторзначение SQUENCE я знаю до того, как начал транзакцию, а идентити - после А зачем вам до ? Привычки файл-серверного программирования о себе знать дают? -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.12.2004, 13:26 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
А если задачу усложнить и вместо счетчика будет более сложная величина. Допустим текущие остатки по товару на складе? Я так понимаю тут sequence не поможет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 09:49 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
CripА если задачу усложнить и вместо счетчика будет более сложная величина. Допустим текущие остатки по товару на складе? Я так понимаю тут sequence не поможет... А если решать задачу обработки видео в реальном времени, то тут БД ваще не катит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 10:01 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
[quote] А зачем вам до? Привычки файл-серверного программирования о себе знать дают? [/quote] Номер счета например видеть хорошо бы до сохранения. Удобнее вставки подчиненных записей сразу же знать идентификатор родительской. Потом, те же партишин-вью организовать не по int-полю, а по varchar, типа 1B,1C,1D, где B,C,D например - идентифицирует филиал (это когда репликация нужна). Про "достоинства" разеделения identity по диапазонам в mssql, надеюсь не нужно объяснять. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 10:07 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
авторА если решать задачу обработки видео в реальном времени, то тут БД ваще не катит Вообще-то конкретный вопрос был задан, а вы мне какую-то пургу. В Oracle я не специалист, потому и спрашиваю... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 10:24 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
CripВообще-то конкретный вопрос был задан, а вы мне какую-то пургу. В Oracle я не специалист, потому и спрашиваю... Это ты пургу спросил. По твоему "текущие остатки по товару на складе" - это усложнение начальной задачи "счетчик"? ИМХО, это вообще другая задача. О ней недавно ветка была - http://]http://www.sql.ru/forum/actualthread.aspx?tid=145611 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 10:35 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
авторНомер счета например видеть хорошо бы до сохранения. Зачем? авторУдобнее вставки подчиненных записей сразу же знать идентификатор родительской. Аналогично. Вставите родительскую - получите значение, тогда вставляйте подчиненные. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 10:54 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
>>>Зачем? Затем >>>Аналогично. Вставите родительскую - получите значение, тогда вставляйте подчиненные Я с клиента одним пакетом вставляю. А на клиенте, к примеру, два связанных датасета. И что я тогда в подчиненную запись подставлю для связи с родительской? -1? 0? Правильно - GUID сгенерить на клиенте (это по поводу identity, так зачем мне он). А гьюид разбалонсированный получается. Попробуй наверни на него партишин вью, наполнение партишин - непредсказуемо будет, количество партишин - постоянно (условия от A до Z), индексы на гьюид в таблицах - разбалансированы. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 11:15 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Каким пакетом? Что, не можете сначала вставить родительскую, потом дочерние с полученным значением? Ну странно. Одним пакетом в две таблицы одновременно все-равно не вставить, как не старайся :) В общем, это только отговорки и привычка - куча людей работает с identity, вставляет мастер-детайл и все хорошо получается. Потому я с тем же успехом могу сказать: как же вы это без identity работаете!!!??? Непорядок! :)) -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 12:51 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
2tygra а как можно было бы в моей задаче поступить. есть серификаты, там одна табличка, есть там id, cert_no, type. для различных типов своя нумерация начинающаяся с 1, у меня сейчас на каждый тип свой сиквенс, а как с автоинкрементом такое ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 12:56 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Не знаю. Зачем им собственная нумерация? Странно как-то. Ну я бы сделал через max(id)+1, если уж так нужно было бы. Но все же постарался бы сделать сквозную нумерацию. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:11 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
И с max(id)+1 было бы не хуже и не медленнее. А по действиям - то же самое, что селект сделать, что счетчик дернуть -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:12 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
>Не знаю. Зачем им собственная нумерация? Странно как-то. у них разный смысл, соотвественно и страно было бы нумеровать под одну гребенку. там только структура одинаковая, а смысл разный. >Ну я бы сделал через max(id)+1, если уж так нужно было бы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:16 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
>Не знаю. Зачем им собственная нумерация? Странно как-то. у них разный смысл, соотвественно и страно было бы нумеровать под одну гребенку. там только структура одинаковая, а смысл разный. >Ну я бы сделал через max(id)+1, если уж так нужно было бы. в смысле создать на каждый тип по левой табличке с автоинкрементом ? конечно выход ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:19 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
2tygra просто не люблю безпредметные споры. Ты уже со своими "зачем" половину топиков зафлеймил. Тебе говоришь что удобнее так то, ты -что можно обойтись. Конечно можно, ничего нет невозможного. Люди кучу примеров приводят где необходим/удобен sequence, а ты добрую половину из них игнорируешь. Вот еще тебе пример: каждый год нумерация счетов/счет-фактур начинается заново. В оракловом сиквенсе это настраивается с пол пинка, наример. Еще? - Два identity поля может в таблице существовать? Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:19 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
авторпросто не люблю безпредметные споры. Ты уже со своими "зачем" половину топиков зафлеймил. Если кто-то что-то делает, да еще говорит, что так и нужно, то уж наверное он должен объяснить, зачем это именно так :) авторТебе говоришь что удобнее так то, ты -что можно обойтись. Конечно можно, ничего нет невозможного. Кому удобнее? Вам? А мне нет - я вот и говорю, что можно обойтись и без этого. И без смертельных трюков. Если у вас в автомобиле есть педаль сцепления, а у меня нет (автомат), то это же не значит, что моя машина ущербнее :)) авторЛюди кучу примеров приводят где необходим/удобен sequence, а ты добрую половину из них игнорируешь. Я не игнорирую, я говорю о том, что они там мне лично не нужны. Тем более, что их у меня и нет :). Это все-равно что спорить о том, у кого кнопки круглые, а у кого квадратные - у кого что есть, тот на том и работает. Я сниму шляпу, если вы на MS SQL сможете секвенсы использовать :)) А так - вы не умеете без секвенсов, а я умею :) авторВот еще тебе пример: каждый год нумерация счетов/счет-фактур начинается заново. В оракловом сиквенсе это настраивается с пол пинка, наример. Через select max буду делать. Или может быть вообще как-то по-другому все это настраивается. Я пока этим не занимался - других дел хватает. поэтому немогу сказать, как оно на самом деле работает. авторЕще? - Два identity поля может в таблице существовать? Нет. Ну и что? То, что два секвенса может быть, я знаю. И что? Из-за этого, которое еще и применяется в 0.05% случаев, громко кричать, что MS маст дай? Какой-то детский сад у нас получается, из-за мелочей страницы текста исписываем. Ну есть у одних секвенсы, у других нет, зато есть идентити. Ну и что? Ну все же работают, одинаково работают, и если имеют проблемы - более-менее серьезные проблемы, то в других местах, никак не связанных с этой мелочью. Пора закрывать топик. -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:37 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Yo!а как можно было бы в моей задаче поступить. есть серификаты, там одна табличка, есть там id, cert_no, type. для различных типов своя нумерация начинающаяся с 1, у меня сейчас на каждый тип свой сиквенс, а как с автоинкрементом такое ? Хоть и не ко мне вопрос. Я бы разделил ID и нумерацию (что обычно и делаю). ID - на сиквенс, нумерацию на max(id)+1 как вариант. Сиквенсы ведь все равно дыры делают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:51 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
2tygra select max() - это как я понимаю нада сначала единичку прибавить ... конечно решение интересное но годится для системы на 5-10 юзеров, когда идет речь о серьозных системах выстраивать всех в очередь ради того чтоб получить номерок неполучается .... sequence же может раздавать номерки тысячам плюзователей с минимальной задержкой, т.к. это собственно основная его задача. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:51 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
>Я бы разделил ID и нумерацию (что обычно и делаю). ID - на сиквенс, нумерацию на max(id)+1 как вариант. Сиквенсы ведь все равно дыры делают. max(id)+1 не получится, нужно по cert_no+1 причем для определеного типа или отдельный селект, но тогда это нужно делать отдельный селект в той же трнзакции а значит такие транзакции (с каждым типом) можно пускать только по очереди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 13:58 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Yo!max(id)+1 не получится, нужно по cert_no+1 причем для определеного типа или отдельный селект, но тогда это нужно делать отдельный селект в той же трнзакции а значит такие транзакции (с каждым типом) можно пускать только по очереди. При "моей" схеме номера ты можешь присваивать хоть по ночам отдельным заданием по любому алгоритму. Для работоспособности системы - это фиолетово. Ссылки идут по ID, а номера они суть - справочные данные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 14:15 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Забыл еще по поводу дыр... Видел решение где пул id-шников выделяется. Пул хранится в отдельной таблице. Пользователь запрарашивает первый свободный id-шник, в этот момент проставляется признак что ид-шник занят. Если запись не сохраняется в базу, то ид-шник возвращается в пул. Posted via ActualForum NNTP Server 1.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 14:21 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
типа оператор вбивает, а распечатать с номером он сможет ночью :) тогда оператор очень быстро станет фиолетовым ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 14:23 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
Yo!типа оператор вбивает, а распечатать с номером он сможет ночью :) Типа читать надо внимательнее. " хоть ночью", это значит после фиксации ввода записей. Надо сразу - флаг в руки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 14:34 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
авторselect max() - это как я понимаю нада сначала единичку прибавить ... конечно решение интересное но годится для системы на 5-10 юзеров, когда идет речь о серьозных системах выстраивать всех в очередь ради того чтоб получить номерок неполучается .... Если есть соответствующий индекс, то никто и не заметит :)) Секвенс конечно побыстрее будет, но не на столько уж, чтобы все от счастья плакали :)) -- Tygra's -- ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2004, 14:44 |
|
||
|
Счетчик для версионника - как?
|
|||
|---|---|---|---|
|
#18+
tygra авторselect max() - это как я понимаю нада сначала единичку прибавить ... конечно решение интересное но годится для системы на 5-10 юзеров, когда идет речь о серьозных системах выстраивать всех в очередь ради того чтоб получить номерок неполучается .... Если есть соответствующий индекс, то никто и не заметит :)) Секвенс конечно побыстрее будет, но не на столько уж, чтобы все от счастья плакали :)) -- Tygra's -- тогда Вам надо всю табличку заблокировать даже на чтение на время селекта и добавления записи с новым "максимальным" номером... а ну как у вас 100 юзеров изюм поштучно продают?... ИМХО если необходимо делать нумерацию "без дыр" - то оптимально сделать табличку "нумераторов" для каждого типа документа и блокировать только одну запись, оставив в нормальном состоянии табличку документов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.02.2005, 14:39 |
|
||
|
|

start [/forum/topic.php?all=1&fid=32&tid=1546045]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
| others: | 268ms |
| total: | 411ms |

| 0 / 0 |
