powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Параллельная работа c БД в MSSQL
11 сообщений из 11, страница 1 из 1
Параллельная работа c БД в MSSQL
    #33197357
Фотография DisputantF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, пожалуйста.

Описание:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Set cnnDB = New ADODB.Connection
strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Staff;Data Source=MySQLServer"
cnnDB.Open strConnect
Set rst = New ADODB.Recordset
strSQL = "SELECT … FROM …"
rst.Open strSQL, cnnDB
.
.
.

Вопросы:
1. Как запретить чтение для других пользователей, если данные в этот момент используются
2. Как можно «узнать», что другой пользователь внес изменения, в те данные, которые в текущий момент открыты для просмотра другим пользователем.

Большое спасибо.
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33197419
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1. Как запретить чтение для других пользователей, если данные в этот момент используются

использовать тип блокировки при открытии рекордсета adLockPessimistic

автор2. Как можно «узнать», что другой пользователь внес изменения, в те данные, которые в текущий момент открыты для просмотра другим пользователем.

использовать тип курсора adOpenDynamic

пример
rst.Open strSQL, cnnDB, adOpenDynamic, adLockPessimistic

Более подробная информация в МСДН
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33201228
Фотография DisputantF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, вопросы остались.

Описание проекта:
1 форма (Form1), на форме Grid (APEX True DBGrid Pro 6.0 (OLEDB)) - TDBGrid1. Для подключения к БД используется - Microsoft ActiveX Data Object 2.5 Library.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Option Explicit

Private cnnDB       As New ADODB.Connection
Private rstListPost As New ADODB.Recordset
Private strConnect  As String
Private strSQL      As String

Private Sub Form_Load()
    strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Staff;Data Source=MySQLServer"
    cnnDB.Open strConnect
    cnnDB.CursorLocation = adUseClient
     strSQL = "SELECT ... FROM ... "
    rstListPost.Open strSQL, cnnDB, adOpenDynamic, adLockPessimistic, adCmdText
    Set TDBGrid1.DataSource = rstListPost
End Sub

Private Sub Form_Unload(Cancel As Integer)
    rstListPost.Close
    cnnDB.Close
End Sub

Примечание: Запрос содержит соединения не одной таблицы с различными критериями отбора.

Необходимо:
- Чтобы отображались изменения внесенные другими пользователями (к сожалению, использование ADODB.Recordset.CursorType=adOpenDynamic не решает эту проблему).
- Как узнать перед изменением данных (началом новой транзакции), что в текущий момент эти данные используются другим пользователем (заблокированы другой транзакцией).
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33201427
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не знаю ваших задач, но поверьте, использовать серверные блокировки при редактировании - одно из самых неправильных решений.
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33201431
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
подумайте над логическими блокировками - поищите по ГФ - там это не раз и не два обсуждалось.
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33218292
Фотография DisputantF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ГФ – как расшифровывается аббревиатура?
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33218321
Фотография DisputantF
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более подробное описание
1 форма (Form1), на форме Grid (APEX True DBGrid Pro 6.0 (OLEDB)) - TDBGrid1. Для работы с БД используется - Microsoft ActiveX Data Object 2.5 Library.

Код VBA:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Sub Form_Load()
    Set cnnDB = New ADODB.Connection
    strConnect = "Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=Staff;Data Source= MySQLServer "
    cnnDB.CursorLocation = adUseClient
    cnnDB.Open strConnect
    Set rstListPost = New ADODB.Recordset
    rstListPost.Open "spU_LPCView", cnnDB, adOpenDynamic, adLockOptimistic, adCmdStoredProc
End Sub

Private Sub CmdEdit_Click()
    'Редактирование записи
        Dim lngRowAffected As Long
        ‘Вызов формы - определение новых значений полей
	. . .
        ‘
        Call cnnDB.Execute _
            ("spU_LPCUpdate('" & strVal1 & "', " & strVal2 & ", " & _
            rstListPost.Fields("ID_Key").Value & ")", lngRowAffected, adCmdStoredProc)
        rstListPost.Requery
End Sub

Хранимые процедуры:

spU_LPCView:
Код: plaintext
1.
2.
3.
CREATE PROCEDURE spU_LPCView 
AS
SELECT * FROM Table

spU_LPCUpdate:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE spU_LPCUpdate 
   @NewVal1 nvarchar( 255 )='New1',
   @NewVal2 nvarchar( 255 )='New2',
   @ID_Key int= 0 
AS
   UPDATE Table SET Table.Val1=@NewVal1, Table.Val2=@NewVal2
          WHERE Table.ID_Key=@ID_Key 

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

При параллельной работе с этой таблицей нескольких пользователей возникает следующая ситуация:
Пользователь 1 открыл форму и вносит изменения (шаг 1), в этот промежуток времени (до того как пользователь 1 нажал на кнопку ОК) пользователь 2 вносит изменения в эту запись. После того как пользователь 1 нажал на кнопку ОК данные, внесенные пользователем 2, оказываются потерянными. Аналогичная ситуация возникает с операцией удаления.

Вопрос:
Как заблокировать (запретить вносить изменения) запись, которую в текущий момент изменяет пользователь 1, или же «заставить» сервер отслеживать изменения в записи с начала шага 1 и до выполнения в хранимой процедуре оператора UPDATE и в случае внесения изменений за это время запретить выполнение оператора UPDATE.
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33219879
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используй отсоединенные рекордсеты (adOpenStatic, adLockBatchOptimistic и set .ActiveConnection = Nothing). В этом случае при выполнении UpdateBatch, если другой пользователь уже изменил данные на сервере, выскочит ошибка
о том, что данные были изменены или удалены. Отсюда возможны варианты: отменить update и оставить те данные, которые уже есть на сервере; сделать Resync и UpdateBatch - перезаписать измененную запись; или вообще вернуть все как и было на основании UndelyingValue.
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33219885
Фотография Antonariy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Однако т.к. update делается через хранимую процедуру (не сразу заметил), мой совет не актуален.
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33252582
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisputantFГФ – как расшифровывается аббревиатура?
Главный Форум этого сайта - тобишь форум по MsSql
...
Рейтинг: 0 / 0
Параллельная работа c БД в MSSQL
    #33252594
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DisputantF
Вопрос:
Как заблокировать (запретить вносить изменения) запись, которую в текущий момент изменяет пользователь 1, или же «заставить» сервер отслеживать изменения в записи с начала шага 1 и до выполнения в хранимой процедуре оператора UPDATE и в случае внесения изменений за это время запретить выполнение оператора UPDATE.
Примерно так:
перед тем как открыть запись на редактирование - пытаемся вставить в специальную таличку блокировок запись о том, что такой-то пользователь хочет редактировать вот такую запись Если на эту табличку наложить очевидный констрейнт, то такая запись не вставится - это значит, что кто-то эту запись уже редактирует. При выходе из формы редактирования - удаляем блокирующую запись в таблице блокировок.
Понятно, что приложение может "слететь" до выгрузки формы, или связь оборваться - тогда запись остается блокированной навечно - надо руками лезть и удалять. С этим тоже бороться тоже весьма просто - приложение блокирует запись не навсегда, а например, на 10 секунд или минут - достаточно добавить в таблицу логических блокировок срок блокировки и дату начала блокировки. По истечении половины (или трети или двух третей или еще какой-то части) срока приложение должно продлить срок блокировки - таким образом при слете, в разумное время запись "освободится" сама.
Примерно в таком ключе.
Понятно, что это все работает если на сервер ходит только контролируемое Вами приложение, если-же предполагается "зоопарк", то например, можно тригерами на Update редактируемой тблицы проверять не редактируется ли эта запись другим пользователем. И предоставить всем описание процедур, которые надо вызвать чтобы получить состояние блокировок на те или иные записи. Примерно так.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Параллельная работа c БД в MSSQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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