Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Одна "проблемка" есть, опишу подробнее Есть данные на SQL Server, клиент написан на VB6 с использованием ADO Скажем следующие таблицы (во всех таблицах поля ID - IDENTITY-столбцы): Таблица контактов TblContactsIDContact Есть подчиненные данные этих контактов - телефоны: TblPhonesIDContact_IDPrefixPhone Теперь, в клиенте базы, нужно сделать следующее, должна быть возможность при создании новой записи контакта, сразу же указывать телефоны. Это решил следующим образом: 1. Создал временную таблицу, структура почти одинаковая с TblPhones: TblTemp_PhonesUIDPrefixPhone В котором UID - хранит уникальный идентификатор, так вот, в клиенте, при создании новой записи в таблице контактов, генерируется уникальный идентификатор При этом при добавлении новых записей в таблице телефонов контактов, значение UID устанавливается сгенерированный уникальный идентификатор. При нажатии кнопки ОК, в форме добавления нового контакта выполняется следующая SQL-инструкция: Код: plaintext 1. 2. 3. 4. 5. 6. 7. в @NewUID подставляется сгенерированный уникальный идентификатор Таким образом, при добавлении новой записи, все добавляемые данные записываются во временную таблицу, затем, при нажатии ОК, создается контакт, получаем значение ID нового контакта, и перекидываем все записи из временной таблицы Теперь о проблеме ;))) Необходимо реализовать "то же самое" для редактирования существующего контакта, т.е. открывается запись, в котором есть таблица телефонов контакта, можно удалять, изменять, дополнять и т.д., но пока кнопка "ОК" не будет нажата, все вводимые изменения не вступят в силу Подумываю о варианте, изменить структуру временной таблицы телефонов на следующую: TblTemp_PhonesIDRecord_IDUIDContact_IDPrefixPhone Для того, чтобы при открытии формы редактирования записей, телефоны существующего контакта перекидываются в эту промежуточную таблицу, затем при нажатии кнопки ОК, обновляется реальная таблица в соответствии с изменениями в промежуточной таблице, т.е. отражаются изменения Только здесь мне "не нравится" следующие моменты, пользователь может удалить одну запись, может изменить другую запись, т.е. нужно еще продумать реализацию обновления рабочей таблицы в соответствии с изменениями во временной таблице: если запись была удалена - удалить, новую запись - добавить, изменения - обновить в рабочей таблице и т.д. Можно было бы еще, при открытии формы редактирования контакта, перекинуть все записи в промежуточную таблицу TblTemp_Phones, затем при нажатии ОК, удалить данные из "боевой" таблицы, и перекинуть из временной, но такой вариант тоже не подойдет, так как на ID записей будут ссылки в других таблицах Почему нельзя применять транзакции, так как все работает через одно подключение, и все данные редактируются в дочерних MDI-формах, т.е. во время редактирования одной записи в MDI-дочерней форме, пользователь может открыть другую таблицу в другой дочерней форме и редактировать совсем с другими данными, т.е. использование ADO-транзакций в данной ситуации не получится Пожалуйста, подсобите советами, может быть кто-то уже проходил через такое, и решил это более эффективным методом? Спасибо за внимание и заранее благодарю за советы ;) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:01 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
После однократного прочтения... Лично я решаю это методом блокировок. То есть когда один клиент вызвал на редактирование какую-то информацию, другому клиенту при попытке редактирования будет выдано сообщение, что информация редактируется таким-то пользователем на таком-то компе. И нехай ждет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:06 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
после второго прочтения понял, что я немножко не об этом.... А что, на TblPhones.ID действительно есть внешние ссылки? Просто непонятно, зачем, это подчиненная информация вроде как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:11 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
В принципе, я не вижу большой проблемы в синхронизации временной таблицы с постоянной в вашем варианте. Транзакция будет состоять из трех запросов UPDATE, DELETE и INSERT, и полностью синхронизирует временные данные с постоянными. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:13 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Можно использовать следующий метод для подтверждения редактирования существующего контакта: 1. При открытии формы редактирования, предварительно перекидываются записи из рабочей таблицы во временную 2. При добавлении новой записи значение Record_ID устанавливается в -1 3. @CID - хранит значение ID редактируемой записи в таблице контактов И таким образом, при нажатии на кнопку "ОК" выполняется следующая инструкция: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:13 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Proпосле второго прочтения понял, что я немножко не об этом.... А что, на TblPhones.ID действительно есть внешние ссылки? Просто непонятно, зачем, это подчиненная информация вроде как... Реальная задача совсем другая, т.е я не совсем те таблицы как бы привел, но суть проблемы отражает Так что считайте, что ссылки на ID в таблице TblPhones есть ;))) Shocker.ProВ принципе, я не вижу большой проблемы в синхронизации временной таблицы с постоянной в вашем варианте. Транзакция будет состоять из трех запросов UPDATE, DELETE и INSERT, и полностью синхронизирует временные данные с постоянными. Свое сообщение с указанием SQL-инструкции, написал после своего первого поста, т.е. еще не видел ваши сообщения ;)) Вы о таком методе имели в виду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:15 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekМожно использовать следующий метод для подтверждения редактирования существующего контакта: и что вам в нем не нравится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:15 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProorunbekМожно использовать следующий метод для подтверждения редактирования существующего контакта: и что вам в нем не нравится? все устраивает, в принципе просто думаю, может быть кто-то решил подобную проблему более эффективным и "элегантным" способом, как бы вынес решение проблемы на обсуждение, для нахождения "слабых мест" ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:17 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekВы о таком методе имели в виду? Именно. Но он оказывается уже у вас написан, я думал, проблема в самом написании.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:17 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekвсе устраивает, в принципе просто думаю, может быть кто-то решил подобную проблему более эффективным и "элегантным" способом, как бы вынес решение проблемы на обсуждение, для нахождения "слабых мест" ;)) Раз ID трогать нельзя, то это ИМХО - единстенный возможный способ. Использовать транзакции, даже если бы это было возможно, нежелательно, ибо зачем блокировать страницы, пользователь же полдня может заниматься редактированием данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:19 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, проблема использования транзакций даже не в этом, а в другом, представьте ситуацию: 1. пользователь открывает форму редактирования контактов, открывается транзакция 2. затем открывает в другой дочерней форме совсем другие данные и редактирует их 3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:25 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekпроблема использования транзакций даже не в этом, а в другом Не, это как раз не проблема, разумеется новая транзакция должна открываться в новом соединении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:27 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, Вроде бы есть лимит количества открытых транзакций на одно подключение в ADO... Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:32 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekВроде бы есть лимит количества открытых транзакций на одно подключение в ADO... Или я ошибаюсь? Я ведь уточнил - В НОВОМ соединении (подключении, коннекшне) Честно говоря не очень в курсе, возможно в ADO можно открывать именованные транзации и в одном соединении, однако он сам прозрачно для пользователя будет открывать новые коннекшены. Я не пользуюсь транзакциями на клиенте по одной важной причине. Если клиент отвалится по сбою связи - останутся блокировки на таблицах. Блокировки, конечно, потом отвалятся, но на это уйдет время, в это время и другим пользователям, и самому переподключившемуся пользователю нужные таблицы будут недоступны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:37 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, есть ограничение :((, в клиенте работать только через одно подключение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:48 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekесть ограничение :((, в клиенте работать только через одно подключение Один экземпляр коннекшна или одно фактическое соединение с сервером? В некоторых случаях это может быть не одно и то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 21:56 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Proorunbekесть ограничение :((, в клиенте работать только через одно подключение Один экземпляр коннекшна или одно фактическое соединение с сервером? В некоторых случаях это может быть не одно и то же согласен но в моем случае, для клиента это требование и экземпляр один и фактическое соединение одно хотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 22:01 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekЭто решил следующим образом: 1. Создал временную таблицу, структура почти одинаковая с TblPhones:Временную таблицу - нафиг. При добавлении, по Ок, формируешь команду типа: Код: plaintext 1. 2. 3. Если нужно обновлять сразу несколько таблиц - сохрани @@identity в собственную переменную а потом используй ее. При обновлении я вообще не вижу проблем. У тебя ж все данные по контакту уже выкачаны на клиента. А значит и значение ID'ов известны. Просто формируешь строку с update и послыаешь ее. orunbekхотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... Не надо говорить глупости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 22:31 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owl"BEGIN" и "BEGIN TRAN" это две очень разные вещи. Вообще, использовать BEGIN TRAN вредно. Ну-ка ну-ка. Что-то очень много новостей за один раз. 1) Зачем здесь конструкция begin-end? Что изменится, если ее не будет? 2) Почему использование транзакций вредно? Лючшие умы не один десяток лет бьются над использованием транзакций, над уровнями изоляции и т.п., вдруг приходит White Owl и говорит, что это вредно. А мужики-то не знали White OwlПросто формируешь строку с update и послыаешь ее. 3) Что ты предложил нового? White OwlНе надо говорить глупости. 4) Спорить будем? Сразу говорю, я не пробовал ситуацию создавать специально и отслеживать активные соединения, так что мы в равных условиях ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 23:02 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProWhite OwlНе надо говорить глупости. 4) Спорить будем? Сразу говорю, я не пробовал ситуацию создавать специально и отслеживать активные соединения, так что мы в равных условиях Вот демонстрация "сказанной глупости": Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ConnectDBNet() - моя функция установки соединения с SQL-сервером, расписывать смысла нет, курсор используется серверный. Если раскомментировать команду Stop, то в списке процессов на серверы видны два соединения. В файрволе я вижу два TCP-соединения (я работаю по TCP/IP). Хватает аргументов? Оговорюсь, я сам использую только хранимки и Forward/ReadOnly для рекордсетов, но речь идет о том, что ADO может создавать дополнительные соединения, не имея на то прямого указания программиста. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 23:30 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro1) Зачем здесь конструкция begin-end? Что изменится, если ее не будет?Послать пару команд можно и без них, верно. Но для создания переменных, надо делать блок. Код: plaintext 1. Shocker.Pro2) Почему использование транзакций вредно? Лючшие умы не один десяток лет бьются над использованием транзакций, над уровнями изоляции и т.п., вдруг приходит White Owl и говорит, что это вредно. А мужики-то не зналиВот когда играют уровни изоляции, (а это происходит только когда несколько разных людей одновременно лезут в базу) тогда транзакции полезны. А когда ты создаешь транзакцию вручную, то ты на самом деле создаешь не просто транзакцию, а так называемую "вложенную транзакцию" со всеми плюшками и гадостями которые эти вложенные транзакции за собой тянут. Простую транзакцию тебе сервер создает автоматически при посылке любой команды если предыдущая транзакция была закрыта. begin tran - это как раз и есть вложенные транзакции, которые подчиняются правилам цепочности, парности подтверждений и непарности откатов, и прочим радостям жизни. Больше скажу: не существует на свете задачи которая действительно требовала бы использования begin tran. Shocker.ProWhite OwlПросто формируешь строку с update и послыаешь ее. 3) Что ты предложил нового?Ничего. У orunbek в первом посте была предложена совершенная фигня с временными таблицами, а вашу дальнейшую переписку я проглядел по диагонали. Если ты это уже предлагал, то ура. Shocker.Pro4) Спорить будем? Сразу говорю, я не пробовал ситуацию создавать специально и отслеживать активные соединения, так что мы в равных условияхБудем. Я утверждаю что ADO никогда самопроизвольно не создает новых соединений клиента с базой. Попробуй опровергни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 23:35 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProВот демонстрация "сказанной глупости": ... Если раскомментировать команду Stop, то в списке процессов на серверы видны два соединения. В файрволе я вижу два TCP-соединения (я работаю по TCP/IP). Хватает аргументов?Ага... Ну раз будем спорить, то будем спорить. Чистый VBS. Два курсора открываются одновременно. Сервер SA11. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 23:57 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlShocker.Pro1) Зачем здесь конструкция begin-end? Что изменится, если ее не будет?Послать пару команд можно и без них, верно. Но для создания переменных, надо делать блок. Код: plaintext 1. Давай определимся с языком. Автор пишет на MSSQL, а ты какой привел в пример? White Owlот когда играют уровни изоляции, (а это происходит только когда несколько разных людей одновременно лезут в базу) тогда транзакции полезны. А когда ты создаешь транзакцию вручную, то ты на самом деле создаешь не просто транзакцию, а так называемую "вложенную транзакцию" со всеми плюшками и гадостями которые эти вложенные транзакции за собой тянут. Простую транзакцию тебе сервер создает автоматически при посылке любой команды если предыдущая транзакция была закрыта. Похоже, мы говорим о каких-то разных серверах. MSSQL создает неявную транзакцию, если я не задал ее явно. Если я явно указал "begin than" в пакете (как у автора), то никаких дополнительных транзакций больше не будет. Счетчик вложенных тразнакций покажет 1. White Owlbegin tran - это как раз и есть вложенные транзакции, которые подчиняются правилам цепочности, парности подтверждений и непарности откатов, и прочим радостям жизни. begin tran - это любые транзакции, а не только вложенные. White OwlБольше скажу: не существует на свете задачи которая действительно требовала бы использования begin tran. Одну ты назвал сам - многопользовательская работа. Вторая - целостность базы, откат в случае неудачного выполнения предыдущих команд. Думаю, этого достаточно на первое время. Автор грамотно поступает, выполняя последовательность взаимосвязанных команд внутри транзакции, обеспечивая тем самым целостность данных даже в случае сбоев. White OwlShocker.ProWhite OwlПросто формируешь строку с update и послыаешь ее. 3) Что ты предложил нового?Ничего. У orunbek в первом посте была предложена совершенная фигня с временными таблицами, а вашу дальнейшую переписку я проглядел по диагонали. Если ты это уже предлагал, то ура. Ты предложил грубо говоря перегружать данные в массив на клиенте, а потом выгружать обратно в базу (все теми же командами update/delete/insert). Если же ты против временной таблицы для редактирования многострочного контента, то я поддерживаю автора, ибо сам к этому пришел после 14-ти лет проектирования клиент-серверных приложений. Я испльзую, правда, не временную таблицу, а единую таблицу для временных данных редактирования для всех пользователей. но сути дела это не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.05.2010, 23:59 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owl Чистый VBS. Два курсора открываются одновременно. Сервер SA11. 1) как работает sa_conn_info я не знаю 2) твой код не доказывает того, что не бывает ситуаций установки второго коннекта. Мой код доказывает, что бывает. Почему я должен опровергать твой код, ты мой опровергни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 00:07 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProДавай определимся с языком. Автор пишет на MSSQL, а ты какой привел в пример?Transact SQL в вариации для MS SQL 2008. А, ну да, забыл @ у переменной поставить, прошу прощения. Код: plaintext 1. Shocker.ProПохоже, мы говорим о каких-то разных серверах. MSSQL создает неявную транзакцию, если я не задал ее явно. Если я явно указал "begin than" в пакете (как у автора), то никаких дополнительных транзакций больше не будет. Счетчик вложенных тразнакций покажет 1.Да, если begin tran просто так послать то первый раз она будет проигнорирована, на второй и дальше начнется вложеность. Насколько ты уверен что где-то выше по коду или вообще в другом окне ты уже не послал однажды begin tran? Shocker.Probegin tran - это любые транзакции, а не только вложенные.Это только вложенные. Shocker.ProWhite OwlБольше скажу: не существует на свете задачи которая действительно требовала бы использования begin tran.Одну ты назвал сам - многопользовательская работа. Вторая - целостность базы, откат в случае неудачного выполнения предыдущих команд. Думаю, этого достаточно на первое время.Ни один аргумент не играет. Многопользовательская работа не требует явного начала транзакции. Откат всегда будет делаться на начало автоматической транзакции а не на begin tran. То о чем ты думаешь называется точками сохранения (в терминах MSSQL: save tran). Вот их можно ставить посреди настоящей транзакции и на них можно откатываться. А без точки сохранения ты всегда будешь откатывать до самого внешнего begin tran в случае вложенных транзакций либо до begin tran который совпадает с началом автоматической транзакции. Shocker.ProАвтор грамотно поступает, выполняя последовательность взаимосвязанных команд внутри транзакции, обеспечивая тем самым целостность данных даже в случае сбоев.Нет. Он поступает глупо. а) Никто не гарантирует что в другом окне пользователь не пошлет другую begin tran (и кстати TC об этой проблеме догадывается, смотри самый первый пост). б) Целостность гарантируется тем что в случае сбоя сервер откатит все что не было подтверждено. Я надеюсь у тебя выключена AutoCommit опция? Shocker.ProТы предложил грубо говоря перегружать данные в массив на клиенте, а потом выгружать обратно в базу (все теми же командами update/delete/insert).Да. Это самый надежный и простой метод работы. А что, кто-то еще пользуется DBGrid'ами? Shocker.ProЕсли же ты против временной таблицы для редактирования многострочного контента, то я поддерживаю автора, ибо сам к этому пришел после 14-ти лет проектирования клиент-серверных приложений. Я испльзую, правда, не временную таблицу, а единую таблицу для временных данных редактирования для всех пользователей. но сути дела это не меняет.ээээ.... в 14 лет уже надо бы понимать как работают транзакции... Впрочем, юноша, у вас еще все впереди :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 00:32 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProWhite Owl Чистый VBS. Два курсора открываются одновременно. Сервер SA11. 1) как работает sa_conn_info я не знаюВыдает список коннектов к серверу. Примерно как sp_who в MSSQL только удобнее. Shocker.Pro2) твой код не доказывает того, что не бывает ситуаций установки второго коннекта. Мой код доказывает, что бывает. Почему я должен опровергать твой код, ты мой опровергни.Во первых, твой код и мой код с точки зрения ADO ничем не отличаются. Во вторых, я попытался намекнуть что коннекты к серверу устанавливает не ADO, а интерфейсный драйвер и если он считает что надо открывать второй коннект, к ADO это никоим образом не относится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 00:40 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlTransact SQL в вариации для MS SQL 2008. А, ну да, забыл @ у переменной поставить, прошу прощения. Код: plaintext 1. Одна команда упадет, другая выполнится. Да, только пальцем в небо. Ибо обе эти строки выполнятся абсолютно одинаково и безошибочно. a=b+с a=(b+c) Вот примерно это ты и написал. Как Си-шник ты должен прекрасно понимать, что такое операторные скобки (это в VB их нет) White OwlДа, если begin tran просто так послать то первый раз она будет проигнорирована, на второй и дальше начнется вложеность. Насколько ты уверен что где-то выше по коду или вообще в другом окне ты уже не послал однажды begin tran? White OwlShocker.Probegin tran - это любые транзакции, а не только вложенные.Это только вложенные. Вложенность - это когда нечто одно вложено в нечто другое. Если begin tran встречается только один раз, то ничего ни во что вложено не будет. Про то, что она будет проигнорирована - ты уже какую-то глупость несешь. После begin tran с первой операции с таблицами пойдут блокировки на эти таблицы (в зависимости от уровня изоляции). При rollback будет откат всех операций, начиная с begin. Сделать rollback для неявной транзакции (в MSSQL) невозможно (кроме триггера). Почитай про @@TRANCOUNT, поэкспериментируй. White OwlМногопользовательская работа не требует явного начала транзакции. Откат всегда будет делаться на начало автоматической транзакции а не на begin tran. Бред. Откатить транзакцию нельзя без ее явного начала. Автоматическая (неявная) транзакция коммитится/откатывается там же, где и началась и повлиять на нее вручную можно только в триггере. А если ты хочешь, чтобы несколько пользователей попытавшись сохраниить несколько связанных таблиц одновременно, разрушили логическую структуру - то пожалуйста, можешь не использовать. White OwlА без точки сохранения ты всегда будешь откатывать до самого внешнего begin tran в случае вложенных транзакций либо до begin tran который совпадает с началом автоматической транзакции. Разумеется, для того он и нужен. И у автора выполнится откат транзакции из трех операций на начало пакета. White OwlShocker.ProАвтор грамотно поступает, выполняя последовательность взаимосвязанных команд внутри транзакции, обеспечивая тем самым целостность данных даже в случае сбоев. Нет. Он поступает глупо. а) Никто не гарантирует что в другом окне пользователь не пошлет другую begin tran (и кстати TC об этой проблеме догадывается, смотри самый первый пост). Опять бред. Когда в другом окне пользователь пошлет другой begin tran, он сможет это сделать только в другом соединении. Он НИКАК не сможет допустить вложения в тот пакет, который в этот момент выполняется, ибо пакет цел и неделим от begin до commit и отправляется целиком на сервер (в варианте ТС-а). Если же ты рассматриваешь ADO -шный метод .BeginTrans - то я тоже против его использования по примерно тем причинам, про которые говоришь ты, об этом я писал выше ТС-у. Shocker.Proб) Целостность гарантируется тем что в случае сбоя сервер откатит все что не было подтверждено. Верно. У ТС-са такой порядок: begin tran insert delete update commit tran Если на update произойдет сбой, то откатится и insert и delete. Если же убрать транзакцию, то insert и delete закоммиттятся, а update откатится/ Shocker.ProДа. Это самый надежный и простой метод работы. А что, кто-то еще пользуется DBGrid'ами? Лично я - нет. Про ТС - не знаю. Надежный и простой для простых случаев типа приведенного ТС-сом примера с телефонами. Но он и сам говорит, что на самом деле у него более сложная задача, и я про свои задачи имел ввиду более сложные вещи. Но я дополню себя - это удобно, когда бизнес-логика реализована на стороне сервера. Тогда в процессе редактирования возможен пересчет текущих связанных значений из базы, выдача результатов запросов с джойнами, упрощение сохранения и загрузки данных и т.п. White OwlShocker.ProЕсли же ты против временной таблицы для редактирования многострочного контента, то я поддерживаю автора, ибо сам к этому пришел после 14-ти лет проектирования клиент-серверных приложений. Я испльзую, правда, не временную таблицу, а единую таблицу для временных данных редактирования для всех пользователей. но сути дела это не меняет.ээээ.... в 14 лет уже надо бы понимать как работают транзакции... Впрочем, юноша, у вас еще все впереди :) без перехода на личности обойдемся По поводу двух соединений: возможно драйвер SyBase-а и позволяет открыть параллельную транзакцию (не вложенную) и ADO этим пользуется. Но в SQL для открытия параллельной транзакции он вынужден открывать и параллельное соединение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 01:15 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlВо вторых, я попытался намекнуть что коннекты к серверу устанавливает не ADO, а интерфейсный драйвер и если он считает что надо открывать второй коннект, к ADO это никоим образом не относится. Гм. На таком уровне спорить не готов. Тогда я пас, а свое утверждение переформулирую в: При использовании ADO возможно возникновение дополнительных соединений с сервером без явного желания программиста Именно это расстраивает ТС ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 01:20 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProДа, только пальцем в небо. Ибо обе эти строки выполнятся абсолютно одинаково и безошибочно.Ок. Признаю, этот test-case излишне упрощенный. Завтра я тебе сделаю программку выдающую 111-ую ошибку если не использовать операторные скобки. Shocker.ProВложенность - это когда нечто одно вложено в нечто другое. Если begin tran встречается только один раз, то ничего ни во что вложено не будет. Про то, что она будет проигнорирована - ты уже какую-то глупость несешь. После begin tran с первой операции с таблицами пойдут блокировки на эти таблицы (в зависимости от уровня изоляции). При rollback будет откат всех операций, начиная с begin. Сделать rollback для неявной транзакции (в MSSQL) невозможно (кроме триггера). Почитай про @@TRANCOUNT, поэкспериментируй.Вот-вот. Почитай, поэкспериментируй. Shocker.ProБред. Откатить транзакцию нельзя без ее явного начала. Автоматическая (неявная) транзакция коммитится/откатывается там же, где и началась и повлиять на нее вручную можно только в триггере.А что, у автоматической транзакции нету явного начала? Она расплывчато начинается? А уж влиять на транзакции из триггеров это вообще приглашать в гости большого и жирного песца. Shocker.ProОпять бред. Когда в другом окне пользователь пошлет другой begin tran, он сможет это сделать только в другом соединении. Он НИКАК не сможет допустить вложения в тот пакет, который в этот момент выполняется, ибо пакет цел и неделим от begin до commit и отправляется целиком на сервер (в варианте ТС-а).В пакет - не сможет, в несколько следующих друг за другом команд - сможет запросто. Shocker.ProВерно. У ТС-са такой порядок: begin tran insert delete update commit tran Если на update произойдет сбой, то откатится и insert и delete. Если же убрать транзакцию, то insert и delete закоммиттятся, а update откатится/Ээээ... чего-чего? С чего это вдруг insert и delete будут откатываться??? Shocker.Proбез перехода на личности обойдемсяНе я первый попытался давить годами. И кстати, у меня все равно больше :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 02:18 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
--- меняем тему с транзакций на подключения ---- Shocker.ProПо поводу двух соединений: возможно драйвер SyBase-а и позволяет открыть параллельную транзакцию (не вложенную) и ADO этим пользуется. Но в SQL для открытия параллельной транзакции он вынужден открывать и параллельное соединение.Во первых, Sybase (не надо лишних прописных букв). Во вторых, нет, там не транзакции параллельные, там параллельные курсоры. И в третьих, повторяю: это не ADO, это интерфейсный драйвер который используется через ADO. ADO это враппер. Враппер а не драйвер. ADO ничего не знает про теневые подключения и в принципе ничего не может знать. Возьми другой драйвер и теневые подключения исчезнут. Возможно даже что ты от них можешь избавится всего-лишь задачей специального ключика в строке соединения (я не знаю сейчас какого именно). Shocker.Pro При использовании ADO возможно возникновение дополнительных соединений с сервером без явного желания программиста Скандирую: ADO здесь ни при чем! ADO здесь ни при чем! ADO здесь ни при чем! Не обвиняйте враппер в грех драйвера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 02:23 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owl ... ... orunbekхотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... Не надо говорить глупости. дела были, отходил по поводу скрытых подключений, я на своей практике видел такое тема по этому поводу Аудит изменений через CONTEXT_INFO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 05:15 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owl ... ... ADO это враппер. Враппер а не драйвер. ADO ничего не знает про теневые подключения и в принципе ничего не может знать. Возьми другой драйвер и теневые подключения исчезнут. Возможно даже что ты от них можешь избавится всего-лишь задачей специального ключика в строке соединения (я не знаю сейчас какого именно). Shocker.Pro При использовании ADO возможно возникновение дополнительных соединений с сервером без явного желания программиста Скандирую: ADO здесь ни при чем! ADO здесь ни при чем! ADO здесь ни при чем! Не обвиняйте враппер в грех драйвера. может быть интерфейсный драйвер и открывает, но в определенных ситуациях при использовании ADO для подключения к MSSQL с использованием Provider=SQLOLEDB Создаются дополнительные коннекты к серверу, это я на личном опыте 100% "проходил" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 05:29 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlShocker.ProДа, только пальцем в небо. Ибо обе эти строки выполнятся абсолютно одинаково и безошибочно.Ок. Признаю, этот test-case излишне упрощенный. Завтра я тебе сделаю программку выдающую 111-ую ошибку если не использовать операторные скобки. А зачем ты передергиваешь? Речь шла о том, что твой совет ТС-у поставить операторные скобки вокруг двух его инсертов не имеет смысла. Впрочем, очень интересно увидеть 111-ю ошибку для begin (кроме, разумеется, тех мест, где это положено по синтаксису, например в неинлайновой процедуре) White OwlShocker.ProПочитай про @@TRANCOUNT, поэкспериментируй.Вот-вот. Почитай, поэкспериментируй. пожалуйста Код: plaintext 1. 2. 3. 4. результат 0 1 0 никакой вложенности не наблюдаю. White OwlА что, у автоматической транзакции нету явного начала? Она расплывчато начинается? Нету явного оператора начала. Она начинается перед командой и заканчивается сразу после нее. White OwlА уж влиять на транзакции из триггеров это вообще приглашать в гости большого и жирного песца. А я этого и не предлагал. Я просто упомянул об этой возможности, чтобы ты не придрался к моему утверждению, что нельзя повлиять на выполнение скрытой транзакции. White OwlВ пакет - не сможет, в несколько следующих друг за другом команд - сможет запросто. У ТС-а был именно пакет. Зачем передергивать. White OwlShocker.ProВерно. У ТС-са такой порядок: begin tran insert delete update commit tran Если на update произойдет сбой, то откатится и insert и delete. Если же убрать транзакцию, то insert и delete закоммиттятся, а update откатится/Ээээ... чего-чего? С чего это вдруг insert и delete будут откатываться??? Ибо не коммитили. White OwlНе я первый попытался давить годами. И кстати, у меня все равно больше :) А я не пытался давить. И уж тем более не говорил этого в контексте транзакций. Просто упомянул, что время у меня было, чтобы попробовать различные варианты хранения редактируемых данных. White OwlСкандирую: ADO здесь ни при чем! ADO здесь ни при чем! ADO здесь ни при чем! Не обвиняйте враппер в грех драйвера. Тихо-тихо. Уши заложило. Я ведь уже согласился. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 11:44 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekдела были, отходил по поводу скрытых подключений, я на своей практике видел такое тема по этому поводу Аудит изменений через CONTEXT_INFO Да, придется White Owl-у спорить с GreenSunrise - а это сложнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 11:50 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
скрытые подключения - это результат вашего кода 2 примера: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. в первом случае откроется дополнительный коннект к базе для рекордсета, во втором будет использовано уже открытое соединение. PS и не забываем про пулл соединений ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 11:56 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Konst_Oneскрытые подключения - это результат вашего кода В моем коде таких конструкций нет: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 12:17 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProKonst_Oneскрытые подключения - это результат вашего кода В моем коде таких конструкций нет: Код: plaintext я не конкретно про ваш код, я просто показал откуда могут взяться скрытые соединения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 12:19 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Konst_OneShocker.ProKonst_Oneскрытые подключения - это результат вашего кода В моем коде таких конструкций нет: Код: plaintext я не конкретно про ваш код, я просто показал откуда могут взяться скрытые соединения даже при использовании такого кода, по идее без конкретного подключения не должны появляться, "скрытые", "второстепенные" или другие левые подключения, только через одно основное подключение, которе и разработчик создает я даже пробовал отрубать все пулы, по любому не получилось, поэтому аудит изменений данных в MSSQL в связке VB6+ADO не получилось реализовать через CONTEXT_INFO, пришлось другими "обходными" путями делать ну а по теме, подобные задачки не решали? эмулирование транзакций? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:08 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
вы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:12 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Konst_Oneвы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что? Борется за красоту кода ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:15 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProKonst_Oneвы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что? Борется за красоту кода это очень эфемерное понятие и у всех разное ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:16 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProKonst_Oneвы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что? Борется за красоту кода По своему да ;)) За эффективное решение метода, плюс избежание потенциальных дедлоков тоже Но в основном с тем, чтобы - во первых можно было создавать скажем контакта и сразу же указывать телефоны еще не добавленного контакта - во вторых, чтобы изменения в силу не вступали пока ОК не нажат, при этом без использования транзакций причине в теме писал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:19 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
причина отказа от транзакций и использований промежуточных таблиц: автор представьте ситуацию: 1. пользователь открывает форму редактирования контактов, открывается транзакция 2. затем открывает в другой дочерней форме совсем другие данные и редактирует их 3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется сам пост ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:22 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
создайте ещё одну табличку , где будете хранить значения счётчика. напишите процедурку ,которая вам будет выдавать следующее значение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:23 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Konst_One, а описанный мною метод? С использованием промежуточных таблиц? Попробовал внедрить, все работает как надо Если есть конструктивные и аргументированные предложения по изменению метода или использования совершенно другого способа, буду очень рад ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:28 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekKonst_One, а описанный мною метод? С использованием промежуточных таблиц? Попробовал внедрить, все работает как надо Если есть конструктивные и аргументированные предложения по изменению метода или использования совершенно другого способа, буду очень рад нормальный подход, если работает как вам надо, то лучше не надо ничего менять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 13:49 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekпричина отказа от транзакций и использований промежуточных таблиц: автор представьте ситуацию: 1. пользователь открывает форму редактирования контактов, открывается транзакция 2. затем открывает в другой дочерней форме совсем другие данные и редактирует их 3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется сам пост А чем не устраивает клиент-серверный подход? При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:39 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owlorunbekпричина отказа от транзакций и использований промежуточных таблиц: автор представьте ситуацию: 1. пользователь открывает форму редактирования контактов, открывается транзакция 2. затем открывает в другой дочерней форме совсем другие данные и редактирует их 3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется сам пост А чем не устраивает клиент-серверный подход? При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность. видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:42 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro, сделай лучше это: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:45 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Konst_OneWhite OwlА чем не устраивает клиент-серверный подход? видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходитЭто как это? Маша открыла запись, исправила одно поле, Петя на другой машине открыл эту же запись, увидел Машины исправления, поверх них сделал свои исправления. А потом кто-то из них нажал Save... Не, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:52 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlKonst_OneWhite OwlА чем не устраивает клиент-серверный подход? видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходитЭто как это? Маша открыла запись, исправила одно поле, Петя на другой машине открыл эту же запись, увидел Машины исправления, поверх них сделал свои исправления. А потом кто-то из них нажал Save... Не, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов. не так конечно , но может какие-то списки заполняются на формах из данных этих таблиц и тп ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:53 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlНе, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов. По моему вы подумали за ТС-а много лишнего. Ибо сделано у него все нормально и красиво, без грязных чтений и транзакций в разных соединениях, дальнейшие рассуждения только о том, а нельзя ли сделать еще красивее (/удобнее/практичнее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:57 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlShocker.Pro, сделай лучше это: А потом рассматривай результаты разумеется я получаю Server: Msg 3903, Level 16, State 1, Line 14 The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. ибо ты пытаешься откатить несуществующую транзакцию ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 17:59 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owlorunbekпричина отказа от транзакций и использований промежуточных таблиц: автор представьте ситуацию: 1. пользователь открывает форму редактирования контактов, открывается транзакция 2. затем открывает в другой дочерней форме совсем другие данные и редактирует их 3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется сам пост А чем не устраивает клиент-серверный подход? При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность. Сама задача несколько другая, я просто описал как бы прототип в форме редактирования записи есть несколько гридов, в которых редактируются подчиненные данные основной записи, подобной таблице телефонов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:11 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlKonst_OneWhite OwlА чем не устраивает клиент-серверный подход? видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходитЭто как это? Маша открыла запись, исправила одно поле, Петя на другой машине открыл эту же запись, увидел Машины исправления, поверх них сделал свои исправления. А потом кто-то из них нажал Save... Не, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов. нет, такого нет, в каждой записи есть дополнительное поле, которое указывает на то, что определенный пользователь уже открыл для редактирования, пока значение этого поля не сбросится никто другой не может редактировать запись сброс происходит в двух случаях: 1. завершение редактирования 2. сброс администратором системы поля открытости записи в коде подтверждения изменений есть проверка соответствия поля открытости значению в момент открытия, эти "вещи", в принципе само-собою подразумевающиеся, из-за этого я и не стал про это писать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:14 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProWhite OwlShocker.Pro, сделай лучше это: А потом рассматривай результаты разумеется я получаю Server: Msg 3903, Level 16, State 1, Line 14 The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. ибо ты пытаешься откатить несуществующую транзакцию Замечательно. А теперь расскажи мне какой транзакции принадлежит какой из insert'ов? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:18 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekСама задача несколько другая, я просто описал как бы прототип в форме редактирования записи есть несколько гридов, в которых редактируются подчиненные данные основной записи, подобной таблице телефоновИ что это меняет? Или ты привязываешь гриды напрямую к курсорам? Если да, то срочно отвязывать. Пользователь должен иметь прямой доступ только к массивам в памяти клиентской машины. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:21 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro... дальнейшие рассуждения только о том, а нельзя ли сделать еще красивее (/удобнее/практичнее) попали в десятку!!!! этого и я жду в этой теме к примеру White OwlА чем не устраивает клиент-серверный подход? При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность. тоже интересный вариант, но как написал выше, есть еще дополнительные специфичные моменты, из-за которых описанный метод "чуть-чуть" не подходит ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:22 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlShocker.ProWhite OwlShocker.Pro, сделай лучше это: А потом рассматривай результаты разумеется я получаю Server: Msg 3903, Level 16, State 1, Line 14 The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION. ибо ты пытаешься откатить несуществующую транзакцию Замечательно. А теперь расскажи мне какой транзакции принадлежит какой из insert'ов? Это допрос? первый и последний инсерт выполняются внутри собственных implicit-транзакций (счетчиком мы этого не увидим) второй выполняется в явно открытой транзакции, счетчиком мы увидим 1. И что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:23 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekнет, такого нет, в каждой записи есть дополнительное поле, которое указывает на то, что определенный пользователь уже открыл для редактирования, пока значение этого поля не сбросится никто другой не может редактировать запись сброс происходит в двух случаях: 1. завершение редактирования 2. сброс администратором системы поля открытости записи в коде подтверждения изменений есть проверка соответствия поля открытости значению в момент открытия, эти "вещи", в принципе само-собою подразумевающиеся, из-за этого я и не стал про это писатьЭто вещь как раз из разряда "как делать не надо". Маша открыла запись и вместе с Админом ушла на обед. В результате никто к записи добраться не может. Чтобы Маша с Петей могли редактировать одну и ту-же логическую запись и при этом свести конфликты к минимуму, достаточно запомнить предыдущее значение записи и перед физическим обновлением убедится что запись по прежнему в том состоянии в каком она была при прочтении. При несовпадении выдать соответсвующее окошко. То есть схема в идеале будет такой: - Открываем окно. Открываем курсоры. Читаем в собственные массивы все данные которые возможно редактировать. Читаешь дату последнего обновления записи. Закрываем курсоры. - Пользователь редактирует все что ему угодно. - Пользователь командует "Сохранить". Читаешь дату последнего обновления записи, если она совпадает с той которую ты прочитал в начале работы - просто сохраняешь все и обновляешь дату. Если не совпадает - выдаешь окно типа "КТО-ТО уже изменил эту запись! Прочитать изменения и вернуться в редактирование, игнорировать чужие изменения или отменить все и закрыть окно?" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:32 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlЭто вещь как раз из разряда "как делать не надо". ... - Пользователь командует "Сохранить". Читаешь дату последнего обновления записи, если она совпадает с той которую ты прочитал в начале работы - просто сохраняешь все и обновляешь дату. Если не совпадает - выдаешь окно типа "КТО-ТО уже изменил эту запись! Прочитать изменения и вернуться в редактирование, игнорировать чужие изменения или отменить все и закрыть окно?" И что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше Маша а) бегает по всем пользователям выясняет и синхронизирует свои изменения со всеми другими пользователями б) перезаписывает поверх, затирая работу других пользователей и внося сбои в процесс работы. в) закрывает карточку, открывает заново и долго мучительно вспоминает, что же она редактировала. Какой вариант наименее глупый? Правильный ответ - блокировка карточки. Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет. Для облегчения - права на разблокировку карточки даются нескольким ответственным лицам, чтобы кто-то из них всегда мог быть на месте, а также делается открытие карточки в режиме "только для чтения" если кто-то ее уже редактирует или даже всегда открывать только для чтения, а на редактирования выдывается дополнительной кнопкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:41 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Proпервый и последний инсерт выполняются внутри собственных implicit-транзакций (счетчиком мы этого не увидим) второй выполняется в явно открытой транзакции, счетчиком мы увидим 1.Угу. А кто интересно закоммитил последнюю вставку? Я же ее отменять пытался? Я же там явно rollback написал! Какая сволочь последнюю вставку утвердила? Мой хрустальный шар утверждает что у тебя включен AutoCommit. То есть изменения которые ты не предварял командой begin tran ты уже в принципе не сможешь откатить... Замечательно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:41 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProИ что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше МашаА дальше Маша смотрит на дополнительный диалог и видит в нем новые текущие значения и изменные ею значения. Shocker.ProПравильный ответ - блокировка карточки. Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет.Проще предусмотреть заранее, чем потом наказывать людей и надеятся что это наказание пойдет впрок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:45 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.Pro[quot White Owl] ... Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет. Для облегчения - права на разблокировку карточки даются нескольким ответственным лицам, чтобы кто-то из них всегда мог быть на месте, а также делается открытие карточки в режиме "только для чтения" если кто-то ее уже редактирует или даже всегда открывать только для чтения, а на редактирования выдывается дополнительной кнопкой. Вы прямо мой метод описываете, в интерфейсе клиента, по умолчанию и стоит кнопка чтения а чтобы изменить необходимо нажать дополнительную кнопочку и потом выбрать команду "Изменить запись", т.е. человек должен 100% уверенным быть, что он хочет изменить запись, т.е. открыть для "монопольного" изменения по поводу "пиз$#лей" понравилось ;))))) Маша это заслужила ;)) А поводу прав, в программе предусмотрена возможность делегирования возможностей "сброса" статуса редактирования P.S. Постепенно "выходят в свет" нюансы системы, про которые в начале темы не писал ;)).... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:47 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlУгу. А кто интересно закоммитил последнюю вставку? Я же ее отменять пытался? Я же там явно rollback написал! Какая сволочь последнюю вставку утвердила? Мой хрустальный шар утверждает что у тебя включен AutoCommit. То есть изменения которые ты не предварял командой begin tran ты уже в принципе не сможешь откатить... Замечательно. И что? Я должен каждый раз явно коммитить любой блин одиночный запрос? Я согласен, чтобы одиночный запрос коммитился сам, на то он и одиночный. И вообще, не представляю себе ситуации, когда нужно откатывать одиночный запрос. Если я его написал, я же предполагаю его выполнять, а не откатывать. А в случае пакета запросов я укажу транзакцию явно. Не вижу сбоя в логике рассуждений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:49 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlShocker.ProИ что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше МашаА дальше Маша смотрит на дополнительный диалог и видит в нем новые текущие значения и изменные ею значения. Shocker.ProПравильный ответ - блокировка карточки. Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет.Проще предусмотреть заранее, чем потом наказывать людей и надеятся что это наказание пойдет впрок. Лучше резервировать, чем применять такой метод, можно даже в паре с вашим методом применять т.е. выгрузить в машину клиента, при этом зарезервировав запись, а потом после завершения сначала проверяем резервацию, если это наш резерв, то подтверждаем изменения, иначе выдаем соответствующее сообщение вроде ADO.NET что-то подобное используется? верно? т.е. связки с сервером базы данных нету? выгружаются данные и потом редактируются, верно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:50 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
orunbekВы прямо мой метод описываете, в интерфейсе клиента, по умолчанию и стоит кнопка чтения а чтобы изменить необходимо нажать дополнительную кнопочку ... в программе предусмотрена возможность делегирования возможностей "сброса" статуса редактирования Да потому что к этому приходишь с опытом программирования определенного рода систем. Видимо у нас с вами системы похожего назначения, а Белый Сыч программирует какие-то другие системы. Например для прапорщиков ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:51 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White OwlShocker.ProИ что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше МашаА дальше Маша смотрит на дополнительный диалог и видит в нем новые текущие значения и изменные ею значения. Это хорошо при трех-четырех полях на одном уровне. А если это таблица, где могут быть удаленные, добавленые и измененные записи? А если таких таблиц несколько? А если внесенных изменений несолько? А если на форме несколько закладок? Да ты задолбаешься программировать интерфейс сравнения версий, не говоря уж о том, что надо вести полные логи изменений, что тоже не всегда оправдано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 19:56 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProorunbekВы прямо мой метод описываете Да потому что к этому приходишь с опытом программирования определенного рода систем. Есть некоторое отличие - блокировки пишу не в редактируемую таблицу, а в некоторую сводную. Так проще очистить блокировки при аварийном пропадании клиента. Shocker.Pro Например для прапорщиков Надеюсь не слишком погорячился в пылу спора? А то прошу прощения! White Owl - возвращайся! Ты еще не показал пример с ошибкой 111 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.05.2010, 21:06 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Shocker.ProДа потому что к этому приходишь с опытом программирования определенного рода систем. Видимо у нас с вами системы похожего назначения, а Белый Сыч программирует какие-то другие системы. Например для прапорщиков Нет. У меня Маши и Пети обычно сидят на разных континентах. Для меня блокировка любого вида - немедленное растерзание. Намного простительнее потерять часовую работу одного человека чем заблокировать тысячу. Shocker.ProWhite Owl - возвращайся! Ты еще не показал пример с ошибкой 111 И не покажу. Это уже я погорячился слегка. 111-ая возникает при отправке DDL команд которые не любят быть в пакете, операторными скобками оно не лечится. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 00:50 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
White Owl, Shocker.Pro Вы как-то спорите о прелестях белого и сладкого. Оба подхода имеют право на жизнь и прекрасно живут в условиях своей специфики :) Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 10:23 |
|
||
|
"Эмулирование" транзакций
|
|||
|---|---|---|---|
|
#18+
Игорь ГорбоносВы как-то спорите о прелестях белого и сладкого. Да мы уже и не спорим, так, вяло пинаемся... White OwlНет. У меня Маши и Пети обычно сидят на разных континентах. Для меня блокировка любого вида - немедленное растерзание. Намного простительнее потерять часовую работу одного человека чем заблокировать тысячу. Это немного другое дело. Ну как минимум всем редактирующим пользователям должно немедленно выдаваться предупреждение о том, что карточку редактируют 2+ человек. Впрочем, полагаю, у тебя это реализовано. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.05.2010, 10:31 |
|
||
|
|

start [/forum/topic.php?all=1&fid=60&tid=2159800]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
34ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
143ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 447ms |

| 0 / 0 |
