powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / "Эмулирование" транзакций
72 сообщений из 72, показаны все 3 страниц
"Эмулирование" транзакций
    #36624215
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приветствую всех.
Одна "проблемка" есть, опишу подробнее
Есть данные на SQL Server, клиент написан на VB6 с использованием ADO
Скажем следующие таблицы (во всех таблицах поля ID - IDENTITY-столбцы):
Таблица контактов
TblContactsIDContact

Есть подчиненные данные этих контактов - телефоны:
TblPhonesIDContact_IDPrefixPhone

Теперь, в клиенте базы, нужно сделать следующее, должна быть возможность при создании новой записи контакта, сразу же указывать телефоны. Это решил следующим образом:
1. Создал временную таблицу, структура почти одинаковая с TblPhones:
TblTemp_PhonesUIDPrefixPhone
В котором UID - хранит уникальный идентификатор, так вот, в клиенте, при создании новой записи в таблице контактов, генерируется уникальный идентификатор
При этом при добавлении новых записей в таблице телефонов контактов, значение UID устанавливается сгенерированный уникальный идентификатор.
При нажатии кнопки ОК, в форме добавления нового контакта выполняется следующая SQL-инструкция:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
BEGIN TRAN
DECLARE @NRID bigint
INSERT INTO TblContacts (Contact) SELECT N'Новый контакт'
SET @NRID=SCOPE_IDENTITY()
INSERT INTO TblPhones (Contact_ID, Prefix, Phone)
SELECT @NRID, Prefix, Phone FROM TblTemp_Phones WHERE UID=@NewUID
COMMIT TRAN

в @NewUID подставляется сгенерированный уникальный идентификатор
Таким образом, при добавлении новой записи, все добавляемые данные записываются во временную таблицу, затем, при нажатии ОК, создается контакт, получаем значение ID нового контакта, и перекидываем все записи из временной таблицы

Теперь о проблеме ;))) Необходимо реализовать "то же самое" для редактирования существующего контакта, т.е. открывается запись, в котором есть таблица телефонов контакта, можно удалять, изменять, дополнять и т.д., но пока кнопка "ОК" не будет нажата, все вводимые изменения не вступят в силу
Подумываю о варианте, изменить структуру временной таблицы телефонов на следующую:
TblTemp_PhonesIDRecord_IDUIDContact_IDPrefixPhone
Для того, чтобы при открытии формы редактирования записей, телефоны существующего контакта перекидываются в эту промежуточную таблицу, затем при нажатии кнопки ОК, обновляется реальная таблица в соответствии с изменениями в промежуточной таблице, т.е. отражаются изменения
Только здесь мне "не нравится" следующие моменты, пользователь может удалить одну запись, может изменить другую запись, т.е. нужно еще продумать реализацию обновления рабочей таблицы в соответствии с изменениями во временной таблице: если запись была удалена - удалить, новую запись - добавить, изменения - обновить в рабочей таблице и т.д.
Можно было бы еще, при открытии формы редактирования контакта, перекинуть все записи в промежуточную таблицу TblTemp_Phones, затем при нажатии ОК, удалить данные из "боевой" таблицы, и перекинуть из временной, но такой вариант тоже не подойдет, так как на ID записей будут ссылки в других таблицах

Почему нельзя применять транзакции, так как все работает через одно подключение, и все данные редактируются в дочерних MDI-формах, т.е. во время редактирования одной записи в MDI-дочерней форме, пользователь может открыть другую таблицу в другой дочерней форме и редактировать совсем с другими данными, т.е. использование ADO-транзакций в данной ситуации не получится

Пожалуйста, подсобите советами, может быть кто-то уже проходил через такое, и решил это более эффективным методом?

Спасибо за внимание и заранее благодарю за советы ;)
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624220
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После однократного прочтения...

Лично я решаю это методом блокировок. То есть когда один клиент вызвал на редактирование какую-то информацию, другому клиенту при попытке редактирования будет выдано сообщение, что информация редактируется таким-то пользователем на таком-то компе. И нехай ждет...
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624223
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
после второго прочтения понял, что я немножко не об этом....

А что, на TblPhones.ID действительно есть внешние ссылки? Просто непонятно, зачем, это подчиненная информация вроде как...
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624224
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В принципе, я не вижу большой проблемы в синхронизации временной таблицы с постоянной в вашем варианте.
Транзакция будет состоять из трех запросов UPDATE, DELETE и INSERT, и полностью синхронизирует временные данные с постоянными.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624225
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать следующий метод для подтверждения редактирования существующего контакта:
1. При открытии формы редактирования, предварительно перекидываются записи из рабочей таблицы во временную
2. При добавлении новой записи значение Record_ID устанавливается в -1
3. @CID - хранит значение ID редактируемой записи в таблице контактов

И таким образом, при нажатии на кнопку "ОК" выполняется следующая инструкция:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
BEGIN TRAN
--добавляем новые записи
INSERT INTO TblPhones (Contact_ID, Prefix, Phone)
SELECT Contact_ID, Prefix, Phone
FROM TblTemp_Phones WHERE UID=@NewUID AND Contact_ID=@CID AND Record_ID=- 1 
--отражаем удаления
DELETE TblPhones WHERE (Contact_ID=@CID) AND (NOT (ID IN (SELECT Record_ID FROM TblTemp_Phones WHERE UID=@NewUID AND Conact_ID=@CID)))
--отражаем обновления
UPDATE TblPhones SET Prefix=t.Prefix, Phone=t.Phone
FROM TblPhones p INNER JOIN TblTemp_Phones t ON p.ID=t.Record_ID
WHERE t.UID=@NewUID AND t.Contact_ID=@CID
COMMIT TRAN
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624227
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпосле второго прочтения понял, что я немножко не об этом....

А что, на TblPhones.ID действительно есть внешние ссылки? Просто непонятно, зачем, это подчиненная информация вроде как...

Реальная задача совсем другая, т.е я не совсем те таблицы как бы привел, но суть проблемы отражает
Так что считайте, что ссылки на ID в таблице TblPhones есть ;)))

Shocker.ProВ принципе, я не вижу большой проблемы в синхронизации временной таблицы с постоянной в вашем варианте.
Транзакция будет состоять из трех запросов UPDATE, DELETE и INSERT, и полностью синхронизирует временные данные с постоянными.
Свое сообщение с указанием SQL-инструкции, написал после своего первого поста, т.е. еще не видел ваши сообщения ;))
Вы о таком методе имели в виду?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624228
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekМожно использовать следующий метод для подтверждения редактирования существующего контакта:

и что вам в нем не нравится?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624230
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProorunbekМожно использовать следующий метод для подтверждения редактирования существующего контакта:

и что вам в нем не нравится?

все устраивает, в принципе
просто думаю, может быть кто-то решил подобную проблему более эффективным и "элегантным" способом, как бы вынес решение проблемы на обсуждение, для нахождения "слабых мест" ;))
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624231
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekВы о таком методе имели в виду?

Именно. Но он оказывается уже у вас написан, я думал, проблема в самом написании....
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624233
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekвсе устраивает, в принципе
просто думаю, может быть кто-то решил подобную проблему более эффективным и "элегантным" способом, как бы вынес решение проблемы на обсуждение, для нахождения "слабых мест" ;))

Раз ID трогать нельзя, то это ИМХО - единстенный возможный способ.

Использовать транзакции, даже если бы это было возможно, нежелательно, ибо зачем блокировать страницы, пользователь же полдня может заниматься редактированием данных
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624241
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

проблема использования транзакций даже не в этом, а в другом,
представьте ситуацию:
1. пользователь открывает форму редактирования контактов, открывается транзакция
2. затем открывает в другой дочерней форме совсем другие данные и редактирует их
3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624245
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekпроблема использования транзакций даже не в этом, а в другом

Не, это как раз не проблема, разумеется новая транзакция должна открываться в новом соединении.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624248
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

Вроде бы есть лимит количества открытых транзакций на одно подключение в ADO...
Или я ошибаюсь?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624262
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekВроде бы есть лимит количества открытых транзакций на одно подключение в ADO...
Или я ошибаюсь?

Я ведь уточнил - В НОВОМ соединении (подключении, коннекшне)

Честно говоря не очень в курсе, возможно в ADO можно открывать именованные транзации и в одном соединении, однако он сам прозрачно для пользователя будет открывать новые коннекшены.

Я не пользуюсь транзакциями на клиенте по одной важной причине. Если клиент отвалится по сбою связи - останутся блокировки на таблицах. Блокировки, конечно, потом отвалятся, но на это уйдет время, в это время и другим пользователям, и самому переподключившемуся пользователю нужные таблицы будут недоступны.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624280
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro,

есть ограничение :((, в клиенте работать только через одно подключение
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624289
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekесть ограничение :((, в клиенте работать только через одно подключение

Один экземпляр коннекшна или одно фактическое соединение с сервером? В некоторых случаях это может быть не одно и то же
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624293
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proorunbekесть ограничение :((, в клиенте работать только через одно подключение

Один экземпляр коннекшна или одно фактическое соединение с сервером? В некоторых случаях это может быть не одно и то же

согласен
но в моем случае, для клиента это требование
и экземпляр один и фактическое соединение одно
хотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой....
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624345
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekЭто решил следующим образом:
1. Создал временную таблицу, структура почти одинаковая с TblPhones:Временную таблицу - нафиг.
При добавлении, по Ок, формируешь команду типа:
Код: plaintext
1.
2.
3.
begin
   insert into TblContacts (Contact) values('some new name')
   insert into TblPhones (Contact_ID, Prefix, Phone) values(@@identity, '123', '1234567')
end
Обрати внимание что это не транзакция! "BEGIN" и "BEGIN TRAN" это две очень разные вещи. Вообще, использовать BEGIN TRAN вредно.
Если нужно обновлять сразу несколько таблиц - сохрани @@identity в собственную переменную а потом используй ее.

При обновлении я вообще не вижу проблем. У тебя ж все данные по контакту уже выкачаны на клиента. А значит и значение ID'ов известны. Просто формируешь строку с update и послыаешь ее.

orunbekхотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... Не надо говорить глупости.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624410
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl"BEGIN" и "BEGIN TRAN" это две очень разные вещи. Вообще, использовать BEGIN TRAN вредно.

Ну-ка ну-ка. Что-то очень много новостей за один раз.

1) Зачем здесь конструкция begin-end? Что изменится, если ее не будет?

2) Почему использование транзакций вредно? Лючшие умы не один десяток лет бьются над использованием транзакций, над уровнями изоляции и т.п., вдруг приходит White Owl и говорит, что это вредно. А мужики-то не знали

White OwlПросто формируешь строку с update и послыаешь ее.

3) Что ты предложил нового?

White OwlНе надо говорить глупости.

4) Спорить будем? Сразу говорю, я не пробовал ситуацию создавать специально и отслеживать активные соединения, так что мы в равных условиях
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624452
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Public Sub ADOMultiConnect()

Dim Cnn As ADODB.Connection, tm As New ADODB.Recordset, op As New ADODB.Recordset
Set Cnn = ConnectDBNet()

op.Open "SELECT @@SPID", Cnn
Debug.Print op.Fields( 0 )
op.Close

tm.Open "SELECT 1", Cnn, adOpenKeyset, adLockOptimistic

op.Open "SELECT @@SPID", Cnn
Debug.Print op.Fields( 0 )
'Stop
op.Close

tm.Close

op.Open "SELECT @@SPID", Cnn
Debug.Print op.Fields( 0 )
op.Close

End Sub


ConnectDBNet() - моя функция установки соединения с SQL-сервером, расписывать смысла нет, курсор используется серверный.

Если раскомментировать команду Stop, то в списке процессов на серверы видны два соединения. В файрволе я вижу два TCP-соединения (я работаю по TCP/IP). Хватает аргументов?

Оговорюсь, я сам использую только хранимки и Forward/ReadOnly для рекордсетов, но речь идет о том, что ADO может создавать дополнительные соединения, не имея на то прямого указания программиста.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624460
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro1) Зачем здесь конструкция begin-end? Что изменится, если ее не будет?Послать пару команд можно и без них, верно. Но для создания переменных, надо делать блок.
Код: plaintext
1.
adoConnection.Execute "declare a int select a=1 select a"
adoConnection.Execute "begin declare a int select a=1 select a end"
Одна команда упадет, другая выполнится.

Shocker.Pro2) Почему использование транзакций вредно? Лючшие умы не один десяток лет бьются над использованием транзакций, над уровнями изоляции и т.п., вдруг приходит White Owl и говорит, что это вредно. А мужики-то не зналиВот когда играют уровни изоляции, (а это происходит только когда несколько разных людей одновременно лезут в базу) тогда транзакции полезны. А когда ты создаешь транзакцию вручную, то ты на самом деле создаешь не просто транзакцию, а так называемую "вложенную транзакцию" со всеми плюшками и гадостями которые эти вложенные транзакции за собой тянут. Простую транзакцию тебе сервер создает автоматически при посылке любой команды если предыдущая транзакция была закрыта.
begin tran - это как раз и есть вложенные транзакции, которые подчиняются правилам цепочности, парности подтверждений и непарности откатов, и прочим радостям жизни.
Больше скажу: не существует на свете задачи которая действительно требовала бы использования begin tran.

Shocker.ProWhite OwlПросто формируешь строку с update и послыаешь ее.
3) Что ты предложил нового?Ничего. У orunbek в первом посте была предложена совершенная фигня с временными таблицами, а вашу дальнейшую переписку я проглядел по диагонали. Если ты это уже предлагал, то ура.

Shocker.Pro4) Спорить будем? Сразу говорю, я не пробовал ситуацию создавать специально и отслеживать активные соединения, так что мы в равных условияхБудем. Я утверждаю что ADO никогда самопроизвольно не создает новых соединений клиента с базой. Попробуй опровергни.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624483
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
Dim Cnn, tm, op
Set Cnn = CreateObject("ADODB.Connection")
set op = CreateObject("ADODB.Recordset")
set tm = CreateObject("ADODB.Recordset")

getNumberOfConnections = "select count(*) from sa_conn_info()"

cnn.Open "DSN=EAS Demo DB V115 IM"

op.Open getNumberOfConnections , Cnn
call printRs(op)
op.Close

tm.Open "SELECT 'aaa'", Cnn,  1 ,  3 

op.Open getNumberOfConnections , Cnn
call printRs(op)
op.Close

call printRs(tm)
tm.Close

op.Open getNumberOfConnections , Cnn
call printRs(op)
op.Close


public sub printRS(byref rs)
set fout = wscript.stdout
do while not rs.eof
	for i= 0  to rs.Fields.Count- 1 
		if i> 0  then fout.Write ","
		field_data = trim(""&rs(i))
		if instr(field_data, ",") then field_data = """" & field_data & """"
		fout.Write field_data
	next
	fout.WriteLine
	rs.MoveNext
loop
end sub
Вывод скрипта:
Код: plaintext
1.
2.
3.
  1
  1
  aaa
  1
Где двойки?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624489
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlShocker.Pro1) Зачем здесь конструкция begin-end? Что изменится, если ее не будет?Послать пару команд можно и без них, верно. Но для создания переменных, надо делать блок.
Код: plaintext
1.
adoConnection.Execute "declare a int select a=1 select a"
adoConnection.Execute "begin declare a int select a=1 select a end"
Одна команда упадет, другая выполнится.


Давай определимся с языком. Автор пишет на 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-ти лет проектирования клиент-серверных приложений. Я испльзую, правда, не временную таблицу, а единую таблицу для временных данных редактирования для всех пользователей. но сути дела это не меняет.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624503
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Чистый VBS. Два курсора открываются одновременно. Сервер SA11.


1) как работает sa_conn_info я не знаю

2) твой код не доказывает того, что не бывает ситуаций установки второго коннекта. Мой код доказывает, что бывает. Почему я должен опровергать твой код, ты мой опровергни.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624525
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДавай определимся с языком. Автор пишет на MSSQL, а ты какой привел в пример?Transact SQL в вариации для MS SQL 2008. А, ну да, забыл @ у переменной поставить, прошу прощения.
Код: plaintext
1.
adoConnection.Execute "declare @a int select @a=1 select @a"
adoConnection.Execute "begin declare @a int select @a=1 select @a end"
Так лучше?


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 лет уже надо бы понимать как работают транзакции... Впрочем, юноша, у вас еще все впереди :)
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624535
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProWhite Owl
Чистый VBS. Два курсора открываются одновременно. Сервер SA11.

1) как работает sa_conn_info я не знаюВыдает список коннектов к серверу. Примерно как sp_who в MSSQL только удобнее.

Shocker.Pro2) твой код не доказывает того, что не бывает ситуаций установки второго коннекта. Мой код доказывает, что бывает. Почему я должен опровергать твой код, ты мой опровергни.Во первых, твой код и мой код с точки зрения ADO ничем не отличаются.
Во вторых, я попытался намекнуть что коннекты к серверу устанавливает не ADO, а интерфейсный драйвер и если он считает что надо открывать второй коннект, к ADO это никоим образом не относится.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624560
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlTransact SQL в вариации для MS SQL 2008. А, ну да, забыл @ у переменной поставить, прошу прощения.
Код: plaintext
1.
adoConnection.Execute "declare @a int select @a=1 select @a"
adoConnection.Execute "begin declare @a int select @a=1 select @a end"
Так лучше?

Одна команда упадет, другая выполнится.

Да, только пальцем в небо. Ибо обе эти строки выполнятся абсолютно одинаково и безошибочно.
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 для открытия параллельной транзакции он вынужден открывать и параллельное соединение.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624563
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlВо вторых, я попытался намекнуть что коннекты к серверу устанавливает не ADO, а интерфейсный драйвер и если он считает что надо открывать второй коннект, к ADO это никоим образом не относится.

Гм. На таком уровне спорить не готов.
Тогда я пас, а свое утверждение переформулирую в:
При использовании ADO возможно возникновение дополнительных соединений с сервером без явного желания программиста

Именно это расстраивает ТС
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624593
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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без перехода на личности обойдемсяНе я первый попытался давить годами. И кстати, у меня все равно больше :)
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624595
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
--- меняем тему с транзакций на подключения ----

Shocker.ProПо поводу двух соединений: возможно драйвер SyBase-а и позволяет открыть параллельную транзакцию (не вложенную) и ADO этим пользуется. Но в SQL для открытия параллельной транзакции он вынужден открывать и параллельное соединение.Во первых, Sybase (не надо лишних прописных букв). Во вторых, нет, там не транзакции параллельные, там параллельные курсоры. И в третьих, повторяю: это не ADO, это интерфейсный драйвер который используется через ADO.

ADO это враппер. Враппер а не драйвер. ADO ничего не знает про теневые подключения и в принципе ничего не может знать. Возьми другой драйвер и теневые подключения исчезнут. Возможно даже что ты от них можешь избавится всего-лишь задачей специального ключика в строке соединения (я не знаю сейчас какого именно).


Shocker.Pro При использовании ADO возможно возникновение дополнительных соединений с сервером без явного желания программиста
Скандирую: ADO здесь ни при чем! ADO здесь ни при чем! ADO здесь ни при чем!
Не обвиняйте враппер в грех драйвера.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624620
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
...
...
orunbekхотя иногда ADO, сам скрытно создает дополнительные подключения... гад такой.... Не надо говорить глупости.

дела были, отходил
по поводу скрытых подключений, я на своей практике видел такое
тема по этому поводу
Аудит изменений через CONTEXT_INFO
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36624622
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
...
...
ADO это враппер. Враппер а не драйвер. ADO ничего не знает про теневые подключения и в принципе ничего не может знать. Возьми другой драйвер и теневые подключения исчезнут. Возможно даже что ты от них можешь избавится всего-лишь задачей специального ключика в строке соединения (я не знаю сейчас какого именно).


Shocker.Pro При использовании ADO возможно возникновение дополнительных соединений с сервером без явного желания программиста
Скандирую: ADO здесь ни при чем! ADO здесь ни при чем! ADO здесь ни при чем!
Не обвиняйте враппер в грех драйвера.

может быть интерфейсный драйвер и открывает, но в определенных ситуациях при использовании ADO для подключения к MSSQL с использованием Provider=SQLOLEDB
Создаются дополнительные коннекты к серверу, это я на личном опыте 100% "проходил"
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625171
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlShocker.ProДа, только пальцем в небо. Ибо обе эти строки выполнятся абсолютно одинаково и безошибочно.Ок. Признаю, этот test-case излишне упрощенный. Завтра я тебе сделаю программку выдающую 111-ую ошибку если не использовать операторные скобки.

А зачем ты передергиваешь? Речь шла о том, что твой совет ТС-у поставить операторные скобки вокруг двух его инсертов не имеет смысла.
Впрочем, очень интересно увидеть 111-ю ошибку для begin (кроме, разумеется, тех мест, где это положено по синтаксису, например в неинлайновой процедуре)

White OwlShocker.ProПочитай про @@TRANCOUNT, поэкспериментируй.Вот-вот. Почитай, поэкспериментируй.

пожалуйста
Код: plaintext
1.
2.
3.
4.
select @@TRANCOUNT
begin tran
select @@TRANCOUNT
commit tran
select @@TRANCOUNT

результат
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 здесь ни при чем!
Не обвиняйте враппер в грех драйвера.

Тихо-тихо. Уши заложило. Я ведь уже согласился.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625204
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekдела были, отходил
по поводу скрытых подключений, я на своей практике видел такое
тема по этому поводу
Аудит изменений через CONTEXT_INFO

Да, придется White Owl-у спорить с GreenSunrise - а это сложнее
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625226
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
скрытые подключения - это результат вашего кода

2 примера:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Dim rs as ADODB.Recordset
Dim cn as ADODB.Connection

Set cn = New ADODB.Connection
cn.Open ConnectionString

Set rs = New ADODB.Recordset
'1)
rs.Open SQL, cn,...

'2)
Set rs.ActiveConnection = cn
rs.Open SQL,,...

в первом случае откроется дополнительный коннект к базе для рекордсета, во втором будет использовано уже открытое соединение.

PS
и не забываем про пулл соединений
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625313
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneскрытые подключения - это результат вашего кода

В моем коде таких конструкций нет:
Код: plaintext
Set rs.ActiveConnection = cn
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625319
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneскрытые подключения - это результат вашего кода

В моем коде таких конструкций нет:
Код: plaintext
Set rs.ActiveConnection = cn


я не конкретно про ваш код, я просто показал откуда могут взяться скрытые соединения
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625456
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneShocker.ProKonst_Oneскрытые подключения - это результат вашего кода

В моем коде таких конструкций нет:
Код: plaintext
Set rs.ActiveConnection = cn


я не конкретно про ваш код, я просто показал откуда могут взяться скрытые соединения

даже при использовании такого кода, по идее без конкретного подключения не должны появляться, "скрытые", "второстепенные" или другие левые подключения, только через одно основное подключение, которе и разработчик создает
я даже пробовал отрубать все пулы, по любому не получилось, поэтому аудит изменений данных в MSSQL в связке VB6+ADO не получилось реализовать через CONTEXT_INFO, пришлось другими "обходными" путями делать

ну а по теме, подобные задачки не решали? эмулирование транзакций?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625477
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625488
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_Oneвы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что?

Борется за красоту кода
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625494
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneвы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что?

Борется за красоту кода

это очень эфемерное понятие и у всех разное
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625503
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProKonst_Oneвы с чем боретесь то? deadlocks у вас в базе при многопользовательской работе или что?

Борется за красоту кода

По своему да ;)) За эффективное решение метода, плюс избежание потенциальных дедлоков тоже
Но в основном с тем, чтобы
- во первых можно было создавать скажем контакта и сразу же указывать телефоны еще не добавленного контакта
- во вторых, чтобы изменения в силу не вступали пока ОК не нажат, при этом без использования транзакций причине в теме писал
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625513
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
причина отказа от транзакций и использований промежуточных таблиц:

автор
представьте ситуацию:
1. пользователь открывает форму редактирования контактов, открывается транзакция
2. затем открывает в другой дочерней форме совсем другие данные и редактирует их
3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется

сам пост
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625516
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создайте ещё одну табличку , где будете хранить значения счётчика. напишите процедурку ,которая вам будет выдавать следующее значение.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625535
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_One,

а описанный мною метод? С использованием промежуточных таблиц?
Попробовал внедрить, все работает как надо
Если есть конструктивные и аргументированные предложения по изменению метода или использования совершенно другого способа, буду очень рад
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36625605
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekKonst_One,

а описанный мною метод? С использованием промежуточных таблиц?
Попробовал внедрить, все работает как надо
Если есть конструктивные и аргументированные предложения по изменению метода или использования совершенно другого способа, буду очень рад

нормальный подход, если работает как вам надо, то лучше не надо ничего менять.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626341
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekпричина отказа от транзакций и использований промежуточных таблиц:

автор
представьте ситуацию:
1. пользователь открывает форму редактирования контактов, открывается транзакция
2. затем открывает в другой дочерней форме совсем другие данные и редактирует их
3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется

сам пост
А чем не устраивает клиент-серверный подход?
При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626352
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlorunbekпричина отказа от транзакций и использований промежуточных таблиц:

автор
представьте ситуацию:
1. пользователь открывает форму редактирования контактов, открывается транзакция
2. затем открывает в другой дочерней форме совсем другие данные и редактирует их
3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется

сам пост
А чем не устраивает клиент-серверный подход?
При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность.

видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходит
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626365
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro, сделай лучше это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select @@TRANCOUNT
insert into t1 (pk, f1) values( 1 , 1 )
select @@TRANCOUNT
begin tran
select @@TRANCOUNT
insert into t1 (pk, f1) values( 2 , 2 )
select @@TRANCOUNT
commit tran
select @@TRANCOUNT
insert into t1 (pk, f1) values( 3 , 3 )
select @@TRANCOUNT
rollback
select @@TRANCOUNT
select * from t1
А потом рассматривай результаты
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626388
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Konst_OneWhite OwlА чем не устраивает клиент-серверный подход?
видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходитЭто как это? Маша открыла запись, исправила одно поле, Петя на другой машине открыл эту же запись, увидел Машины исправления, поверх них сделал свои исправления. А потом кто-то из них нажал Save... Не, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626391
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlKonst_OneWhite OwlА чем не устраивает клиент-серверный подход?
видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходитЭто как это? Маша открыла запись, исправила одно поле, Петя на другой машине открыл эту же запись, увидел Машины исправления, поверх них сделал свои исправления. А потом кто-то из них нажал Save... Не, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов.

не так конечно , но может какие-то списки заполняются на формах из данных этих таблиц и тп
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626400
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНе, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов.

По моему вы подумали за ТС-а много лишнего. Ибо сделано у него все нормально и красиво, без грязных чтений и транзакций в разных соединениях, дальнейшие рассуждения только о том, а нельзя ли сделать еще красивее (/удобнее/практичнее)
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626408
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlShocker.Pro, сделай лучше это:
А потом рассматривай результаты

разумеется я получаю
Server: Msg 3903, Level 16, State 1, Line 14
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.

ибо ты пытаешься откатить несуществующую транзакцию
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626546
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owlorunbekпричина отказа от транзакций и использований промежуточных таблиц:

автор
представьте ситуацию:
1. пользователь открывает форму редактирования контактов, открывается транзакция
2. затем открывает в другой дочерней форме совсем другие данные и редактирует их
3. после завершения редактирования переходит к форме редактирования контактов и нажимает кнопку "ОТМЕНА", соответственно выполняется откат транзакции, т.е. получается что изменения в других таблицах тоже отменяется

сам пост
А чем не устраивает клиент-серверный подход?
При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность.

Сама задача несколько другая, я просто описал как бы прототип
в форме редактирования записи есть несколько гридов, в которых редактируются подчиненные данные основной записи, подобной таблице телефонов
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626552
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlKonst_OneWhite OwlА чем не устраивает клиент-серверный подход?
видимо у автора где-то есть грязное чтение из используемых в транзакции таблиц, поэтому и не подходитЭто как это? Маша открыла запись, исправила одно поле, Петя на другой машине открыл эту же запись, увидел Машины исправления, поверх них сделал свои исправления. А потом кто-то из них нажал Save... Не, можно конечно и так жить, но заранее закладываться на чехарду нулевого уровня изоляции это .... я не знаю таких цензурных слов.

нет, такого нет, в каждой записи есть дополнительное поле, которое указывает на то, что определенный пользователь уже открыл для редактирования, пока значение этого поля не сбросится никто другой не может редактировать запись
сброс происходит в двух случаях:
1. завершение редактирования
2. сброс администратором системы поля открытости записи

в коде подтверждения изменений есть проверка соответствия поля открытости значению в момент открытия,
эти "вещи", в принципе само-собою подразумевающиеся, из-за этого я и не стал про это писать
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626559
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProWhite OwlShocker.Pro, сделай лучше это:
А потом рассматривай результаты

разумеется я получаю
Server: Msg 3903, Level 16, State 1, Line 14
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION.

ибо ты пытаешься откатить несуществующую транзакцию
Замечательно. А теперь расскажи мне какой транзакции принадлежит какой из insert'ов?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626566
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekСама задача несколько другая, я просто описал как бы прототип
в форме редактирования записи есть несколько гридов, в которых редактируются подчиненные данные основной записи, подобной таблице телефоновИ что это меняет? Или ты привязываешь гриды напрямую к курсорам? Если да, то срочно отвязывать. Пользователь должен иметь прямой доступ только к массивам в памяти клиентской машины.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626568
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro... дальнейшие рассуждения только о том, а нельзя ли сделать еще красивее (/удобнее/практичнее)

попали в десятку!!!! этого и я жду в этой теме
к примеру
White OwlА чем не устраивает клиент-серверный подход?
При открытии формы редактирования, программа открывает транзакцию, выкачивает все нужные данные, закрывает транзакцию. Пользователь редактирует сколько душе угодно. Если в конце была нажата Cancel - просто закрываем форму и все. Если нажали Save - открываем транзакцию, записываем данные, закрываем транзакцию. Все. Минимум блокировок плюс максимальная надежность.

тоже интересный вариант, но как написал выше, есть еще дополнительные специфичные моменты, из-за которых описанный метод "чуть-чуть" не подходит
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626569
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.

И что?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626586
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekнет, такого нет, в каждой записи есть дополнительное поле, которое указывает на то, что определенный пользователь уже открыл для редактирования, пока значение этого поля не сбросится никто другой не может редактировать запись
сброс происходит в двух случаях:
1. завершение редактирования
2. сброс администратором системы поля открытости записи

в коде подтверждения изменений есть проверка соответствия поля открытости значению в момент открытия,
эти "вещи", в принципе само-собою подразумевающиеся, из-за этого я и не стал про это писатьЭто вещь как раз из разряда "как делать не надо". Маша открыла запись и вместе с Админом ушла на обед. В результате никто к записи добраться не может.
Чтобы Маша с Петей могли редактировать одну и ту-же логическую запись и при этом свести конфликты к минимуму, достаточно запомнить предыдущее значение записи и перед физическим обновлением убедится что запись по прежнему в том состоянии в каком она была при прочтении. При несовпадении выдать соответсвующее окошко.

То есть схема в идеале будет такой:
- Открываем окно. Открываем курсоры. Читаем в собственные массивы все данные которые возможно редактировать. Читаешь дату последнего обновления записи. Закрываем курсоры.
- Пользователь редактирует все что ему угодно.
- Пользователь командует "Сохранить". Читаешь дату последнего обновления записи, если она совпадает с той которую ты прочитал в начале работы - просто сохраняешь все и обновляешь дату. Если не совпадает - выдаешь окно типа "КТО-ТО уже изменил эту запись! Прочитать изменения и вернуться в редактирование, игнорировать чужие изменения или отменить все и закрыть окно?"
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626603
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЭто вещь как раз из разряда "как делать не надо".

...

- Пользователь командует "Сохранить". Читаешь дату последнего обновления записи, если она совпадает с той которую ты прочитал в начале работы - просто сохраняешь все и обновляешь дату. Если не совпадает - выдаешь окно типа "КТО-ТО уже изменил эту запись! Прочитать изменения и вернуться в редактирование, игнорировать чужие изменения или отменить все и закрыть окно?"

И что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше Маша
а) бегает по всем пользователям выясняет и синхронизирует свои изменения со всеми другими пользователями
б) перезаписывает поверх, затирая работу других пользователей и внося сбои в процесс работы.
в) закрывает карточку, открывает заново и долго мучительно вспоминает, что же она редактировала.

Какой вариант наименее глупый?

Правильный ответ - блокировка карточки. Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет.

Для облегчения - права на разблокировку карточки даются нескольким ответственным лицам, чтобы кто-то из них всегда мог быть на месте, а также делается открытие карточки в режиме "только для чтения" если кто-то ее уже редактирует или даже всегда открывать только для чтения, а на редактирования выдывается дополнительной кнопкой.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626605
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Proпервый и последний инсерт выполняются внутри собственных implicit-транзакций (счетчиком мы этого не увидим)
второй выполняется в явно открытой транзакции, счетчиком мы увидим 1.Угу. А кто интересно закоммитил последнюю вставку? Я же ее отменять пытался? Я же там явно rollback написал! Какая сволочь последнюю вставку утвердила?
Мой хрустальный шар утверждает что у тебя включен AutoCommit. То есть изменения которые ты не предварял командой begin tran ты уже в принципе не сможешь откатить... Замечательно.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626612
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProИ что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше МашаА дальше Маша смотрит на дополнительный диалог и видит в нем новые текущие значения и изменные ею значения.

Shocker.ProПравильный ответ - блокировка карточки. Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет.Проще предусмотреть заранее, чем потом наказывать людей и надеятся что это наказание пойдет впрок.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626614
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.Pro[quot White Owl]
...
Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет.

Для облегчения - права на разблокировку карточки даются нескольким ответственным лицам, чтобы кто-то из них всегда мог быть на месте, а также делается открытие карточки в режиме "только для чтения" если кто-то ее уже редактирует или даже всегда открывать только для чтения, а на редактирования выдывается дополнительной кнопкой.

Вы прямо мой метод описываете, в интерфейсе клиента, по умолчанию и стоит кнопка чтения а чтобы изменить необходимо нажать дополнительную кнопочку и потом выбрать команду "Изменить запись", т.е. человек должен 100% уверенным быть, что он хочет изменить запись, т.е. открыть для "монопольного" изменения
по поводу "пиз$#лей" понравилось ;))))) Маша это заслужила ;))
А поводу прав, в программе предусмотрена возможность делегирования возможностей "сброса" статуса редактирования

P.S. Постепенно "выходят в свет" нюансы системы, про которые в начале темы не писал ;))....
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626618
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlУгу. А кто интересно закоммитил последнюю вставку? Я же ее отменять пытался? Я же там явно rollback написал! Какая сволочь последнюю вставку утвердила?
Мой хрустальный шар утверждает что у тебя включен AutoCommit. То есть изменения которые ты не предварял командой begin tran ты уже в принципе не сможешь откатить... Замечательно.

И что? Я должен каждый раз явно коммитить любой блин одиночный запрос? Я согласен, чтобы одиночный запрос коммитился сам, на то он и одиночный.

И вообще, не представляю себе ситуации, когда нужно откатывать одиночный запрос. Если я его написал, я же предполагаю его выполнять, а не откатывать.

А в случае пакета запросов я укажу транзакцию явно.

Не вижу сбоя в логике рассуждений.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626621
Фотография orunbek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlShocker.ProИ что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше МашаА дальше Маша смотрит на дополнительный диалог и видит в нем новые текущие значения и изменные ею значения.

Shocker.ProПравильный ответ - блокировка карточки. Один раз Маша карточку не закроет в режиме редактирования, уйдя на обед, получит пиз$#лей и в следующий раз не забудет.Проще предусмотреть заранее, чем потом наказывать людей и надеятся что это наказание пойдет впрок.

Лучше резервировать, чем применять такой метод, можно даже в паре с вашим методом применять
т.е. выгрузить в машину клиента, при этом зарезервировав запись, а потом после завершения сначала проверяем резервацию, если это наш резерв, то подтверждаем изменения, иначе выдаем соответствующее сообщение
вроде ADO.NET что-то подобное используется? верно? т.е. связки с сервером базы данных нету?
выгружаются данные и потом редактируются, верно?
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626625
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
orunbekВы прямо мой метод описываете, в интерфейсе клиента, по умолчанию и стоит кнопка чтения а чтобы изменить необходимо нажать дополнительную кнопочку
...
в программе предусмотрена возможность делегирования возможностей "сброса" статуса редактирования

Да потому что к этому приходишь с опытом программирования определенного рода систем. Видимо у нас с вами системы похожего назначения, а Белый Сыч программирует какие-то другие системы. Например для прапорщиков
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626631
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlShocker.ProИ что? Пользователь внес кучу изменений. При сохранении выяснилось, что другой пользователь (или даже несколько других пользователей) внесли другую кучу изменений. Дальше МашаА дальше Маша смотрит на дополнительный диалог и видит в нем новые текущие значения и изменные ею значения.

Это хорошо при трех-четырех полях на одном уровне. А если это таблица, где могут быть удаленные, добавленые и измененные записи? А если таких таблиц несколько? А если внесенных изменений несолько? А если на форме несколько закладок? Да ты задолбаешься программировать интерфейс сравнения версий, не говоря уж о том, что надо вести полные логи изменений, что тоже не всегда оправдано.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36626721
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProorunbekВы прямо мой метод описываете
Да потому что к этому приходишь с опытом программирования определенного рода систем.
Есть некоторое отличие - блокировки пишу не в редактируемую таблицу, а в некоторую сводную. Так проще очистить блокировки при аварийном пропадании клиента.

Shocker.Pro Например для прапорщиков
Надеюсь не слишком погорячился в пылу спора? А то прошу прощения!
White Owl - возвращайся! Ты еще не показал пример с ошибкой 111
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36627031
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Shocker.ProДа потому что к этому приходишь с опытом программирования определенного рода систем. Видимо у нас с вами системы похожего назначения, а Белый Сыч программирует какие-то другие системы. Например для прапорщиков Нет. У меня Маши и Пети обычно сидят на разных континентах. Для меня блокировка любого вида - немедленное растерзание. Намного простительнее потерять часовую работу одного человека чем заблокировать тысячу.

Shocker.ProWhite Owl - возвращайся! Ты еще не показал пример с ошибкой 111 И не покажу. Это уже я погорячился слегка. 111-ая возникает при отправке DDL команд которые не любят быть в пакете, операторными скобками оно не лечится.
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36627353
Фотография Игорь Горбонос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl, Shocker.Pro

Вы как-то спорите о прелестях белого и сладкого. Оба подхода имеют право на жизнь и прекрасно живут в условиях своей
специфики :)


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
"Эмулирование" транзакций
    #36627367
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Игорь ГорбоносВы как-то спорите о прелестях белого и сладкого.

Да мы уже и не спорим, так, вяло пинаемся...

White OwlНет. У меня Маши и Пети обычно сидят на разных континентах. Для меня блокировка любого вида - немедленное растерзание. Намного простительнее потерять часовую работу одного человека чем заблокировать тысячу.

Это немного другое дело.
Ну как минимум всем редактирующим пользователям должно немедленно выдаваться предупреждение о том, что карточку редактируют 2+ человек. Впрочем, полагаю, у тебя это реализовано.
...
Рейтинг: 0 / 0
72 сообщений из 72, показаны все 3 страниц
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / "Эмулирование" транзакций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]