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

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

| 0 / 0 |
