Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности

Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
12.05.2010, 21:01
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#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:06
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
После однократного прочтения... Лично я решаю это методом блокировок. То есть когда один клиент вызвал на редактирование какую-то информацию, другому клиенту при попытке редактирования будет выдано сообщение, что информация редактируется таким-то пользователем на таком-то компе. И нехай ждет... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:11
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
после второго прочтения понял, что я немножко не об этом.... А что, на TblPhones.ID действительно есть внешние ссылки? Просто непонятно, зачем, это подчиненная информация вроде как... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:13
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#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:15
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
Shocker.Proпосле второго прочтения понял, что я немножко не об этом.... А что, на TblPhones.ID действительно есть внешние ссылки? Просто непонятно, зачем, это подчиненная информация вроде как... Реальная задача совсем другая, т.е я не совсем те таблицы как бы привел, но суть проблемы отражает Так что считайте, что ссылки на ID в таблице TblPhones есть ;))) Shocker.ProВ принципе, я не вижу большой проблемы в синхронизации временной таблицы с постоянной в вашем варианте. Транзакция будет состоять из трех запросов UPDATE, DELETE и INSERT, и полностью синхронизирует временные данные с постоянными. Свое сообщение с указанием SQL-инструкции, написал после своего первого поста, т.е. еще не видел ваши сообщения ;)) Вы о таком методе имели в виду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:15
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
orunbekМожно использовать следующий метод для подтверждения редактирования существующего контакта: и что вам в нем не нравится? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:17
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
Shocker.ProorunbekМожно использовать следующий метод для подтверждения редактирования существующего контакта: и что вам в нем не нравится? все устраивает, в принципе просто думаю, может быть кто-то решил подобную проблему более эффективным и "элегантным" способом, как бы вынес решение проблемы на обсуждение, для нахождения "слабых мест" ;)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:17
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
orunbekВы о таком методе имели в виду? Именно. Но он оказывается уже у вас написан, я думал, проблема в самом написании.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:19
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
orunbekвсе устраивает, в принципе просто думаю, может быть кто-то решил подобную проблему более эффективным и "элегантным" способом, как бы вынес решение проблемы на обсуждение, для нахождения "слабых мест" ;)) Раз ID трогать нельзя, то это ИМХО - единстенный возможный способ. Использовать транзакции, даже если бы это было возможно, нежелательно, ибо зачем блокировать страницы, пользователь же полдня может заниматься редактированием данных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:25
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
Shocker.Pro, проблема использования транзакций даже не в этом, а в другом, представьте ситуацию: 1. пользователь открывает форму редактирования контактов, открывается транзакция 2. затем открывает в другой дочерней форме совсем другие данные и редактирует их 3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:27
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
orunbekпроблема использования транзакций даже не в этом, а в другом Не, это как раз не проблема, разумеется новая транзакция должна открываться в новом соединении. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:32
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
Shocker.Pro, Вроде бы есть лимит количества открытых транзакций на одно подключение в ADO... Или я ошибаюсь? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:37
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
orunbekВроде бы есть лимит количества открытых транзакций на одно подключение в ADO... Или я ошибаюсь? Я ведь уточнил - В НОВОМ соединении (подключении, коннекшне) Честно говоря не очень в курсе, возможно в ADO можно открывать именованные транзации и в одном соединении, однако он сам прозрачно для пользователя будет открывать новые коннекшены. Я не пользуюсь транзакциями на клиенте по одной важной причине. Если клиент отвалится по сбою связи - останутся блокировки на таблицах. Блокировки, конечно, потом отвалятся, но на это уйдет время, в это время и другим пользователям, и самому переподключившемуся пользователю нужные таблицы будут недоступны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:48
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
Shocker.Pro, есть ограничение :((, в клиенте работать только через одно подключение ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 21:56
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
orunbekесть ограничение :((, в клиенте работать только через одно подключение Один экземпляр коннекшна или одно фактическое соединение с сервером? В некоторых случаях это может быть не одно и то же ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 22:01
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
Shocker.Proorunbekесть ограничение :((, в клиенте работать только через одно подключение Один экземпляр коннекшна или одно фактическое соединение с сервером? В некоторых случаях это может быть не одно и то же согласен но в моем случае, для клиента это требование и экземпляр один и фактическое соединение одно хотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 22:31
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#18+
orunbekЭто решил следующим образом: 1. Создал временную таблицу, структура почти одинаковая с TblPhones:Временную таблицу - нафиг. При добавлении, по Ок, формируешь команду типа: Код: plaintext 1. 2. 3. Если нужно обновлять сразу несколько таблиц - сохрани @@identity в собственную переменную а потом используй ее. При обновлении я вообще не вижу проблем. У тебя ж все данные по контакту уже выкачаны на клиента. А значит и значение ID'ов известны. Просто формируешь строку с update и послыаешь ее. orunbekхотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... Не надо говорить глупости. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
12.05.2010, 23:02
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#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:30
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#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:35
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#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:57
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#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:59
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#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-ти лет проектирования клиент-серверных приложений. Я испльзую, правда, не временную таблицу, а единую таблицу для временных данных редактирования для всех пользователей. но сути дела это не меняет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2010, 00:07
|
|||
|---|---|---|---|
|
|||
"Эмулирование" транзакций |
|||
|
#18+
White Owl Чистый VBS. Два курсора открываются одновременно. Сервер SA11. 1) как работает sa_conn_info я не знаю 2) твой код не доказывает того, что не бывает ситуаций установки второго коннекта. Мой код доказывает, что бывает. Почему я должен опровергать твой код, ты мой опровергни. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
13.05.2010, 00:32
|
|||
|---|---|---|---|
"Эмулирование" транзакций |
|||
|
#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 лет уже надо бы понимать как работают транзакции... Впрочем, юноша, у вас еще все впереди :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=60&mobile=1&tid=2159800]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
| others: | 12ms |
| total: | 151ms |

| 0 / 0 |
