Я не могу найти ответ на этот вопрос, и это трудно понять, экспериментируя.Как заблокировать базу данных Access от записи
Я загружаю несколько таблиц в базу данных Microsoft Access с использованием Perl с DBI
и DBD::ODBC
. Все запросы выполняются в рамках одной транзакции, которая фиксируется в конце загрузки (или откатывается при ошибке). База данных находится в многопользовательской среде.
В идеале я хотел бы заблокировать базу данных, чтобы ни один другой процесс не мог вносить какие-либо изменения во время моего процесса загрузки, который длится около минуты и будет выполняться один раз в день. Одна из причин, почему это важно, заключается в том, что иногда во время загрузки я должен посмотреть @@identity
, чтобы получить идентификатор автозапуска записи, которую я только что вставил.
Каковы должны быть мои настройки для блокировки записи? Я в настоящее время использую
Default Open Mode – Shared Default record locking – Edited Record
будет блокировать сделку всей базы данных от записи до тех пор, пока не будет совершен? Если нет, есть ли способ заблокировать все записи, используя
DBI::ODBC
?
С помощью эксперимента я могу сказать, что Access делает для меня блокировку, но я не могу быть уверен, что это полная блокировка.
UPDATE: Код выглядит следующим образом:
#!/usr/bin/perl -w
use strict;
use DBI; #database connection library
#open database connection
my $path='C:\Users\me\Desktop\mydb.accdb';
my $datasource = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=$path";
my $dbh = DBI->connect("dbi:ODBC:$datasource", '', '',
{
PrintError => 0,
PrintWarn => 1,
RaiseError => 1,
AutoCommit => 0,
}) || die "Error connecting: $!";
#Then I do various database operations. Example:
#insert into database:
my $sth_insert = $dbh->prepare(qq{
INSERT INTO table1 (field1, field2)
values (?,?)
})
$sth_insert->execute($value1,$value2);
#get back the autonumber ID: last_insert_id(undef,undef,undef,undef) is not supported
my $sqlQuery = 'SELECT @@IDENTITY';
my $sth_select = $dbh->prepare($sqlQuery);
$sth_select->execute;
my $newId = $sth_select->fetchrow_array; #will this be reliable in multi-user environment with my settings?
#Then I commit the transaction:
$dbh->commit or die $DBI::errstr;
Все это в Eval заявление, так что если он выгоняет ошибку, я откатить вместо того, чтобы совершить.
Я бы лучше заблокировал все (читает и пишет), если смогу.
Пожалуйста, покажите свой код. Вы действительно хотите заблокировать доступ только для записи? Считывание из базы данных может возвращать ложные данные, если они разблокированы. Вы обновляете несколько таблиц? – Borodin
@Borodin - Верно, я бы предпочел блокировать все чтения и записи, если смогу. Я редактировал сообщение с кодом. Спасибо за вашу помощь. – user2026318