powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / "Эмулирование" транзакций
25 сообщений из 72, страница 1 из 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
25 сообщений из 72, страница 1 из 3
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / "Эмулирование" транзакций
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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