Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Горев “Эффективная работа с СУБД”.pdf
Скачиваний:
208
Добавлен:
28.06.2014
Размер:
4.71 Mб
Скачать

converted to PDF by HupBaH9I

Транзакции используют данные, кэшированные в буфере транзакции, а не данные на диске, для того чтобы использовать самые новые данные.

Транзакции не могут переписать существующий индексный файл с помощью команды

INDEX.

Транзакции могут использоваться только с таблицами, принадлежащими базам данных.

Если вы включили ручную блокировку таблицы или файла во время транзакции с помощью функций FLOCK() и RLOCK(), то необходимо обязательно снять блокировку. Команда END TRANSACTION не снимет блокировку.

Во вложенных транзакциях команды ROLLBACK и END TRANSACTION работают с изменениями, которые произошли после последней команды BEGIN TRANSACTION.

Изменения внутри вложенных транзакций не запишутся на диск, пока не завершится самый верхний уровень, то есть не будет выполнена самая последняя команда END TRANSACTION.

Если транзакции выполняются над одними и теми же данными, то преимущество имеет то изменение, которое было выполнено последним, независимо от того, на каком уровне оно находится. Например:

USE Account

BEGIN TRANSACTION

BEGIN TRANSACTION

REPLACE count WITH 103 FOR count=203

END TRANSACTION

REPLACE count WITH 203 FOR count 103

END TRANSACTION

В таблице значение поля так и останется равным 203.

Перепишем данный пример так, что последняя команда REPLACE будет выполняться перед следующим уровнем вложенности:

USE Account

BEGIN TRANSACTION

REPLACE count WITH 203 FOR count 103

BEGIN TRANSACTION

REPLACE count WITH 103 FOR count=203

END TRANSACTION

END TRANSACTION

Теперь значение поля останется тем же, что и было - 103.

Несколько советов по увеличению производительности при работе в сети в приложениях Microsoft Visual FoxPro

Если локальная станция имеет достаточно места на жестком диске или достаточно RAM, то вы можете улучшить производительность, разместив временные файлы на локальном диске или на RAM диске. Перенаправление этих файлов на локальный диск или диск RAM увеличивает производительность за счет уменьшения обращения к сетевому диску. Вы можете указать альтернативное местонахождение для этих файлов, включив выражения EDITWORK, SORTWORK, PROGWORK и TMPFILES в ваш файл CONFIG.FPW.

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

Если есть возможность работать с какими-то файлами монопольно, то используйте эту возможность, так как при монопольном режиме доступ к таблицам осуществляется быстрее. Чтобы уменьшить вероятность попытки одновременного доступа к записи или таблице,

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

Microsoft Access

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

converted to PDF by HupBaH9I

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

Рис. 7.20.

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

Если вы выберете блокировку изменяемой записи, то для других пользователей будет заблокирована запись, которую вы редактируете, и соседние с ней записи, так как Access устанавливает блокировку для страницы. Страницой для таблиц Access является набор записей размером в 2 килобайта. Эту блокировку иногда называют "пессимистической".

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

формы, то можете установить для нее блокировки с помощью свойства RecordLocks, которые могут отличаться от установок по умолчанию для текущего сеанса работы Access. Эти типы блокировок строго соответствуют тем видам, которые вы устанавливаете с помощью диалогового окна Параметры.

Свойство RecordLocks помимо форм присутствует еще у запросов и отчетов. При этом для отчетов нет возможности установить блокировку изменяемой записи, скорее всего потому, что отчет их изменять не может.

В диалоговом окне Параметры можно установить режим по умолчанию для открытия баз данных. Но учтите, что режим доступа к базам данных можно выбирать при их открытии с помощью диалога открытия. Если базы данных открываются монопольно, то остальные пользователи не смогут открыть их, поэтому данный режим вряд ли подходит для сетевого использования.

converted to PDF by HupBaH9I

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

В следующем примере с помощью метода SetOption объекта Application устанавливается пессимистическая блокировка (блокировка страницы), а с помощью метода GetOption и функции MSGBOX() выводится номер текущей блокировки.

Public Sub mygetoption() Dim mystr As String

Application.SetOption "Блокировка по умолчанию", 2

mystr = Application.GetOption("Блокировка по_ умолчанию") MsgBox (mystr)

End Sub

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

открытых экземпляров объектов на различных пользовательских машинах свойство не изменится. То есть, изменив свойство некоего объекта, вам попутно надо убедить пользователя закрыть и снова открыть объект, для того чтобы он смог воспользоваться всеми преимуществами нового значения. Пример изменения свойства Recordlocks для запроса:

Public Sub myqueryproperties()

Dim db As DATABASE, qd As QueryDef

Set db = DBEngine.Workspaces(0).Databases(0) db.QueryDefs("Моя таблица query").Properties("recordLocks") = 2 End Sub

Пример изменения свойства RecordLocks для формы: Public Sub ActiveFormRecordLocksChange

Screen.ActiveForm.RecordLocks = 2 End Sub

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

Поэтому рекомендуем следующую последовательность действий для конкретного использования данной процедуры:

1.Создайте функцию, которая будет содержать одну строчку: ActiveFormRecordLoc1ksChange, то есть вызов процедуры, которая у вас может называться по-другому.

2.Создайте макрос, выполняющий одно действие RunCode, аргументом которого будет вызов нашей функции, которая, к примеру, может называться fActiveFormLocksChange.

3.Создайте пользовательскую панель инструментов, в которую необходимо перетащить графическое изображение макроса из вкладки Макросы.

Выполнив данную последовательность действий, вы получите пользовательскую панель инструментов с одной кнопкой, которая в режиме Конструктора будет устанавливать для вашей формы свойство RecordLocks равным значению 2, что соответствует блокировке изменяемой записи. Проявив фантазию, вы можете дополнить вашу панель инструментов более изощренными инструментами, но основа технологии их создания описана выше.

Очевидно, что то же самое вы можете проделать и для отчетов.

Для того чтобы вы были уверены, что все операции, которые вы хотите провести, были выполнены, используйте методы BeginTrans, CommitTrans и RollBack объекта Workspace.

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

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

Количество вложенных транзакций в Access, так же как и в Visual FoxPro, не может превышать пяти. При этом обратите внимание на следующий факт. Метод CommitTrans для текущего объекта Workspaces делает все изменения необратимыми. В то же время, если транзакция вложенная, то

converted to PDF by HupBaH9I

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

В нижеприведенном примере применяется транзакция для перехода на вторую запись и изменения значения для поля Фамилия. Перед завершением транзакции верхнего уровня предлагается принять решение: заносить изменения на диск или нет.

Sub ForceTrans()

Dim db As DATABASE, wks As Workspace, rst As _ Recordset Dim otvet As Integer

Set wks = DBEngine.Workspaces(0) Set db = wks.Databases(0)

Set rst = db.OpenRecordset("Моя таблица", _ dbOpenDynaset) wks.BeginTrans

wks.BeginTrans

rst.MoveLast rst.AbsolutePosition = 2 rst.Edit

rst.ФАМИЛИЯ = "Макашарипов" rst.UPDATE

wks.CommitTrans

otvet = MsgBox("Изменить", vbYesNo + _ vbDefaultButton1, "Ваше решение") If otvet = vbYes Then

wks.CommitTrans Else

wks.Rollback End If

End Sub

Кроме вложенных транзакций в Access можно использовать параллельные транзакции. Эти транзакции действуют независимо друг от друга. Но при этом вам необходимо создать еще один объект типа Workspace. Соответственно каждая транзакция завершается независимо друг от друга.

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

Public Sub multipletrans()

Dim db As DATABASE, wks As Workspace, rst As _ Recordset Dim db1 As DATABASE, wks1 As Workspace, rst1 As _ Recordset Set wks = DBEngine.Workspaces(0)

Set db = wks.Databases(0)

Set rst = db.OpenRecordset("Моя таблица", _ dbOpenDynaset) Set wks1 = DBEngine.Workspaces(0)

Set db1 = wks1.Databases(0)

Set rst1 = db1.OpenRecordset("Моя таблица", _ dbOpenDynaset) wks.BeginTrans

rst.FindFirst "[Фамилия]='Клинтон'" rst.Edit

rst.ФАМИЛИЯ = "Доул" rst.UPDATE wks1.BeginTrans

rst1.FindFirst "[Фамилия]='Доул'" rst1.Edit

rst1.ФАМИЛИЯ = "Клинтон" rst1.UPDATE wks.CommitTrans wks1.CommitTrans

End Sub

Транзакции являются глобальными в рамках объекта Workspace. Поэтому ваши транзакции могут охватывать несколько баз данных и, соответственно, все множество объектов, которые в них содержатся.

Объекты типа Database и Recordset имеют свойство Transactions, которое может принимать значения True или False. От их значений зависит, сможете ли вы использовать методы BeginTrans, CommitTrans и Rollback для работы с этими объектами. Иногда имеет смысл проверять

Соседние файлы в предмете Программирование на Delphi