|
|
|
VFP+MS SQL транзакции
|
|||
|---|---|---|---|
|
#18+
Кто подскажет правильную технику включения транзакции при записи в таблицы MS SQL SQLEXEC(gnHandle, 'USE test') SQLEXEC(gnHandle, 'BEGIN TRANSACTION') SELECT Some_VFP_Cursor1 DO WHILE !EOF() SQLEXEC(gnHandle, 'INSERT INTO Test VALUES ?x,?y,?z . ') SKIP ENDDO SQLEXEC(gnHandle, 'USE test2') SELECT Some_VFP_Cursor2 DO WHILE !EOF() SQLEXEC(gnHandle, 'INSERT INTO Test2 VALUES ?x,?y,?z ' SKIP ENDDO SQLEXEC(gnHandle, 'END TRANSACTION') Если где-то на серваке рухнуло в середине процесса, тогда ничего не запишет SQL в своих таблицах...... Такая техника правильная???? Всем спасибо... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 01:59 |
|
||
|
VFP+MS SQL транзакции
|
|||
|---|---|---|---|
|
#18+
Hi Valerii! SQLSETPROP(handle, "Transactions", 2), а потом SQLCOMMIT() и SQLROLLBACK() Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 04:46 |
|
||
|
VFP+MS SQL транзакции
|
|||
|---|---|---|---|
|
#18+
Igor Korolyov Hi Valerii! SQLSETPROP(handle, "Transactions", 2), а потом SQLCOMMIT() и SQLROLLBACK() Posted via ActualForum NNTP Server 1.3 Непонял, нужно только SQLSETPROP и все? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 09:32 |
|
||
|
VFP+MS SQL транзакции
|
|||
|---|---|---|---|
|
#18+
Если необходимо обновить неколько таблиц на сервере в пределах одной транзакции, то я бы это обновление оформил в виде хранимой процедуры на сервере. Если вы по какой то причине не хотите этого делать, то: 1. Установить на уровни сессии с сервером установку SET XACT_ABORT ON, которая будет заставлять откатывать сервером ВСЮ транзакцию при ошибки при исполнении любой команды. 2. Вызываете не команду SQLEXEC, а "обертку" (wrapper) для этого команды, которая будет при ошибки выполнения команды на сервере, явно откатывать транзакцию на сервере: Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 12:07 |
|
||
|
VFP+MS SQL транзакции
|
|||
|---|---|---|---|
|
#18+
В FoxPro можно реализовать 2 механизма транзакции на SQL-сервере 1) Явно послать на сервер команды BEGIN TRANSACTION, END TRANSACTION, ROOLBACK. По сути, это то, что ты и написал: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Это был механизм ЯВНОГО начала транзакции 2) Можно указать для соединения специальную настройку SQLSETPROP(handle, "Transactions", 2) Эта настройка означает, что при подаче на сервер любой команды по модификации данных будет автоматически открыта транзакция. В принципе, это "штатный механизм" любого SQL-сервера и от данной настройки не зависит. Но данная настройка означает, что открытая транзакция также автоматически не будет завершена. Т.е. при данной настройке, транзакция, неявно открытая любой командой на модификацию, останется "висеть", пока не будет подана на сервер специальная команда SQLCommit() или SQLRollback() Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. Кстати, я как-то не проверял, разве в MS SQL транзакция может быть распространена не НЕСКОЛЬКО баз данных? Мне всегда казалось, что транзакция - это функция одной базы данных, а не собственно SQL-сервера. Или я тут не прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.02.2006, 12:36 |
|
||
|
|

start [/forum/topic.php?fid=41&tid=1592308]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
79ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
2ms |
| others: | 234ms |
| total: | 399ms |

| 0 / 0 |
