Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
YanMalyakov Member Откуда: Краснодар Сообщений: 36 |
на сервере встроенная функция t-sql EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive'; отрабатывает нормально из 1С 8 нет пСтрСоед = "driver={SQL Server};"+"server="+СокрЛП("test1c")+";"+"uid="+СокрЛП(Login)+"; "+"pwd="+СокрЛП(Password)+";"+"Database="+СокрЛП("SMP_2018"); GlobalConnection = Новый COMОбъект("ADODB.Connection"); GlobalConnection.Provider = "SQLOLEDB"; GlobalConnection.ConnectionTimeout = 15; GlobalConnection.CommandTimeOut = 30; GlobalConnection.ConnectionString = пСтрСоед; GlobalConnection.Open(); GlobalCommand = Новый COMОбъект("ADODB.Command"); GlobalCommand.ActiveConnection = GlobalConnection; GlobalCommand.CommandType = 1; ////ставил типы 1, 4,8 GlobalCommand.prepared = "true"; GlobalCommand.namedParameters = "true"; ///Здесь пытаюсь вызвать функцию GlobalCommand.CommandText = "sp_getapplock"; ////и пытаюсь передать в неё параметр GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 3, 16, )); GlobalCommand.Parameters(0).value = "exclusive"; GlobalCommand.Execute(); ///пишет Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан. ///пробую сделать по другому GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@DbPrincipal", 200, 3, 16,"dbo")); GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@Resource", 200, 1, 12, "SC5197")); GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 1, 16, "exclusive")); GlobalCommand.Execute(); ///пишет Произошла исключительная ситуация (Microsoft OLE DB Provider for SQL Server): Процедура или функция "sp_getapplock" ожидает параметр "@LockMode", который не был указан. ///и даже вот так СтрокаЗапроса = "BEGIN TRAN;EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive';"; GlobalCommand.CommandText = СтрокаЗапроса; GlobalCommand.Execute(); ///ошибок не выдает но и результата блокировки тоже нет //////третий параметр менял с 0 до 4 не помогает GlobalCommand.Parameters.Append(GlobalCommand.CreateParameter("@LockMode", 200, 1, 16,"exclusive")); подскажите пожалуйста как правильно передать LockMode |
2 авг 18, 12:09 [21624132] Ответить | Цитировать Сообщить модератору |
Garya Member Откуда: Москва Сообщений: 32174 Блог |
Тема перенесена по просьбе автора.
Сообщение было отредактировано: 2 авг 18, 15:08 |
|
2 авг 18, 15:08 [21625013] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37199 |
Это единственное, что имеет смысл обсуждать в данном разделе. Как передавать параметры из 1с на сервер, спрашивайте в разделе 1с. Выполните в студии команду BEGIN TRAN;EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive';exec sp_lock @@spid Если рузультат не отличается, то проблема опять в 1с, смотрите профайлером, что у вас происходит. К сообщению приложен файл. Размер - 32Kb Сообщение было отредактировано: 2 авг 18, 15:15 |
||
2 авг 18, 15:15 [21625050] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37199 |
Так же процедура sp_getapplock возвращает результат, которые неплохо бы проанализировать, когда что-то идет не так. |
2 авг 18, 15:16 [21625057] Ответить | Цитировать Сообщить модератору |
YanMalyakov Member Откуда: Краснодар Сообщений: 36 |
Заработал такой вариантСтрокаЗапроса = "BEGIN TRAN;EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC2984';" ; GlobalCommand.CommandText = СтрокаЗапроса; Всем спасибо! |
2 авг 18, 15:54 [21625267] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
YanMalyakov, вам справку запрещают читать? @LockOwner выставьте и не извращайтесь |
2 авг 18, 16:02 [21625319] Ответить | Цитировать Сообщить модератору |
YanMalyakov Member Откуда: Краснодар Сообщений: 36 |
TaPaK, еще вопрос, запускаю в студии что бы снять блокировки USE SMP_2018; GO BEGIN TRAN; EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC2984', @LockOwner = 'Transaction' ; GO смотрю SELECT dm_tran_locks1.request_type, dm_tran_locks1.resource_database_id, dm_tran_locks1.resource_description, dm_tran_locks1.request_session_id, dm_tran_locks1.request_status, dm_tran_locks1.request_mode, dm_tran_locks1.request_owner_type, dm_tran_locks1.resource_associated_entity_id from sys.dm_tran_locks as dm_tran_locks1 показывает что блокировки остались не снятыми,правильно ли снимать sp_getapplock с помощью sp_releaseapplock в таком синтаксисе ? EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC2984', @LockOwner = 'Transaction' ; |
2 авг 18, 16:33 [21625452] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
YanMalyakov, я вообще не понимаю ваших танцев... Вам запрещено хелп открывать? Моргните. так не снимет блокировку BEGIN TRAN; EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC2984', @LockOwner = 'Transaction' ; GO EXEC sp_releaseapplock ... |
2 авг 18, 16:37 [21625479] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
блокировку на транзакции можно снять только внутри этой же транзакции или она сам снимется после окончаниия, длоя сессии всё тоже самое |
2 авг 18, 16:39 [21625491] Ответить | Цитировать Сообщить модератору |
YanMalyakov Member Откуда: Краснодар Сообщений: 36 |
TaPaK,а принудительно нельзя снять блокировку ? я так подумал логически в начале работы модуля проведения документа sp_getapplock перед самым завершением sp_releaseapplock https://docs.microsoft.com/ru-ru/sql/relational-databases/system-stored-procedures/sp-releaseapplock-transact-sql?view=sql-server-2017 подскажи как правильно сделать пожалуйста. |
2 авг 18, 16:43 [21625517] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
что значить принудительно? С другой сессии?
больше похоже на сессию, хотя я без понятия как у вас |
||||
2 авг 18, 16:46 [21625536] Ответить | Цитировать Сообщить модератору |
YanMalyakov Member Откуда: Краснодар Сообщений: 36 |
TaPaK, в 1С в самом документе есть НачатьТранзакцию(); в начале между ними sp_getapplock перед самым завершением sp_releaseapplock а в самом конце ЗафиксироватьТранзакцию(); верно делаю нет ? |
2 авг 18, 16:46 [21625540] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
похоже на то. |
||
2 авг 18, 16:48 [21625551] Ответить | Цитировать Сообщить модератору |
Шыфл Member Откуда: Прага Сообщений: 776 |
Похоже на то, что нужно сначала ресурс получіть, а потом уже трансакцію начінать. |
||
3 авг 18, 13:32 [21628242] Ответить | Цитировать Сообщить модератору |
msLex Member Откуда: Сообщений: 8856 |
Откуда такая уверенность? |
||
3 авг 18, 13:46 [21628312] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
а как получить ресурс = транзакцию до её открытия? ну и BEGIN TRAN; EXEC sp_getapplock @DbPrincipal = 'dbo', @Resource = 'SC5197',@LockMode = 'exclusive', @LockOwner = 'Transaction'; exec sp_lock @@spid EXEC sp_releaseapplock @DbPrincipal = 'dbo', @Resource = 'SC5197', @LockOwner = 'Transaction' COMMIT TRAN exec sp_lock @@spid |
||||
3 авг 18, 14:03 [21628371] Ответить | Цитировать Сообщить модератору |
Шыфл Member Откуда: Прага Сообщений: 776 |
Простая логика. Трансакция SQL по любому откроется, а вот ресурс получить ещё надо... Сначала надо вынуть бумажку из ящика и показать всем, что она у вас в руках, а потом уже делать ваши аrхісложные проводки по таблицам. А то вы говорите вслух "я буду делать проводку", а ящик ещё и не отрывали - вдруг там нет ничего. Тогда ваши слова прозвучали зря... |
||||
3 авг 18, 15:22 [21628633] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
При чём здесь все эти сравнения? Просто пофилософствовать? sp_getapplock по сути ничего не блокирует. Это объявление, с разной длительностью жизни (транзакция/сессия) которое можно проверить в других сессиях/транзакциях |
||||
3 авг 18, 15:25 [21628645] Ответить | Цитировать Сообщить модератору |
Шыфл Member Откуда: Прага Сообщений: 776 |
TaPaK, 1C - это про проводки. Ресурсы - это бумажки. А SQL трансакции - это чтобы пріхо і расход пісалісь вместе. |
3 авг 18, 15:27 [21628655] Ответить | Цитировать Сообщить модератору |
TaPaK Member Откуда: Kiev Сообщений: 6801 |
ох |
||
3 авг 18, 15:41 [21628711] Ответить | Цитировать Сообщить модератору |
Konst_One Member Откуда: Сообщений: 11593 |
развели тут 1с-щину, автор сам не понял, зачем ему это надо, а вы его ещё путаете дополнительно. ТС, чего транзакции то не хватает? если тебе надо другие сессии блокировать в момент пока твоя транзакция работает, то этот код тебя всё равно не спасёт без глобальной переделки твоего клиента 1с |
3 авг 18, 15:45 [21628728] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |