SASGIS - SAS.Планета
View Issue Details
0002857SAS.Планета[All Projects] Багpublic15-10-2015 15:5403-03-2017 09:11
sheavy 
zed 
normalminoralways
resolvedfixed 
Windows7Professional
151010 
151111151111 
0002857: Редактирование базы данны меток двумя пользователями
- Добавление меток: Возникает ошибка если один пользователь добавил метку после того как другой пользователь добавил другую метку.

Текст ошибки: EMarkSystemORMError: MarkSystemORM: ID id empty!

- Редактирование меток: если метка была удалена другим пользователем, после сохранения изменений, метка пропадает без объяснения причин. Кажется, есть смысл перед сохранением проверить, есть ли она еще в базе и если нет, сообщить об этом.

- Удаление меток: проходит без ошибок.
Ошибка воспроизводится при работе Microsoft SQL через ODBC.
Версия 151410.9122 Nigtly
Пользуясь случаем, хотел поблагодарить за инцидент 0002854: Работа с Microsoft SQL через ODBC
БД, метки, многопользоватеская
related to 0002859confirmed  Редактирование метки, удаленной другим пользователем 
related to 0003186confirmed  Ошибка при многопользовательской работе с базой меток в базе MySql 
Issue History
15-10-2015 15:54sheavyNew Issue
15-10-2015 15:55sheavyTag Attached: метки
15-10-2015 15:55sheavyTag Attached: многопользоватеская
15-10-2015 15:56sheavyTag Attached: БД
15-10-2015 19:23zedNote Added: 0016569
15-10-2015 19:26zedStatusnew => confirmed
15-10-2015 19:33zedNote Added: 0016570
16-10-2015 14:46sheavyNote Added: 0016573
16-10-2015 14:48zedNote Added: 0016574
16-10-2015 15:21vdemidovNote Added: 0016575
16-10-2015 15:30zedNote Added: 0016576
16-10-2015 15:33vdemidovNote Added: 0016577
16-10-2015 15:57sheavyNote Added: 0016578
16-10-2015 16:32vdemidovRelationship addedrelated to 0002859
20-10-2015 18:51zedNote Added: 0016602
20-10-2015 18:52zedStatusconfirmed => resolved
20-10-2015 18:52zedFixed in Version => 151111
20-10-2015 18:52zedResolutionopen => fixed
20-10-2015 18:52zedAssigned To => zed
20-10-2015 18:52zedProduct Version.Nightly => 151010
20-10-2015 18:52zedTarget Version => 151111
20-10-2015 18:52zedNote Edited: 0016602bug_revision_view_page.php?bugnote_id=16602#r6751
03-03-2017 09:11vdemidovRelationship addedrelated to 0003186

Notes
(0016569)
zed   
15-10-2015 19:23   
О, а это грабли из-за дефолтной оптимизации в mORMot:

> by default, any INSERT will compute the new ID from an internal variable
> - it is very fast and reliable, unless external IDs can be created
> outside this engine
> - you can set EngineAddUseSelectMaxID=true to execute a slower
> 'select max(ID) from TableName' SQL statement before each EngineAdd()
> - a lighter alternative may be to call EngineAddForceSelectMaxID only when required

И при попытке выставить EngineAddUseSelectMaxID в True, как сказано в доках, вылазит ещё какая-то ошибка, опять же, внутри mORMot: "TODBCStatement - TODBCLib error: [24000] [Microsoft][ODBC Driver 11 for SQL Server]Недопустимое состояние курсора (0)". Интересно, что 2 метки даёт поставить, а вот на третьей падает. Надо идти на форум synopse и выяснять что не так...
(0016570)
zed   
15-10-2015 19:33   
Показательно, что в тоже самое время, в случае с MySQL всё работает просто замечательно.
(0016573)
sheavy   
16-10-2015 14:46   
Да, и правда, в MySQL гораздо лучше.
Но оказывается даже для него второй пункт актуален:

> - Редактирование меток: если метка была удалена другим пользователем, после сохранения изменений, метка пропадает без объяснения причин. Кажется, есть смысл перед сохранением проверить, есть ли она еще в базе и если нет, сообщить об этом.
(0016574)
zed   
16-10-2015 14:48   
>второй пункт актуален:
Это другая проблема и её надо решать отдельно.
(0016575)
vdemidov   
16-10-2015 15:21   
Имхо, самый простой способ решать проблемы конфликтов редактирования (а удаление, это тоже частный случай редактирования) это добавить в метку что-то типа версии (например хэш данных, или счетчик из базы данных, или вообще GUID), которое будет автоматически изменяться при каждом сохранении, и перед сохранением проверять не поменялась ли эта версия. И если поменялась (удаление метки сбрасывает версию в 0), то нужно как минимум сообщать об этом пользователю, а как максимум пытаться автоматически мержить изменения (у нас есть предыдущая версия, есть то что в базе сейчас, и есть то что на редактировали). Но это все потребует кучу изменений в самом САС.
(0016576)
zed   
16-10-2015 15:30   
Я когда занимался проектированием схемы БД спрашивал - а не добавить ли ещё чего-нибудь. Предложений тогда я так и не услышал. Хотел даже в метки таймштампы писать, но vasketsov меня от этого отговорил. Поэтому, сейчас способа разрешить конфликт редактирования невозможно. Будет сохраняться последнее изменение без всяких вопросов. По поводу удаления редактируемой метки - надо будет посмотреть.
(0016577)
vdemidov   
16-10-2015 15:33   
А я, когда говорил что ничего не нужно, подразумевал исключительно однопользовательский режим работы с метками. Поддержку других СУБД ты прикрутил позже. А вообще никто не заставляет использовать одну схему базы для локальной базы и для работы с сервером.
(0016578)
sheavy   
16-10-2015 15:57   
>>второй пункт актуален:
> Это другая проблема и её надо решать отдельно.

сделал отдельный тикет 0002859 (нет прав сделать связь)
(0016602)
zed   
20-10-2015 18:51   
(edited on: 20-10-2015 18:52)
Выяснил что не так: synopse.info/forum/viewtopic.php?pid=18248 - оказывается, помогает отключение встроенного кэширования стейтментов, так что отключил и падать перестало. Возможно это баг фреймворка, так что если его пофиксят, то кэширование можно будет включить назад. И возможно это актуально только для MS SQL, но для надёжности отключил для всех СУБД.