2015-08-10 4 views
0

Я не могу найти ответ на этот вопрос, и это трудно понять, экспериментируя.Как заблокировать базу данных 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 заявление, так что если он выгоняет ошибку, я откатить вместо того, чтобы совершить.

Я бы лучше заблокировал все (читает и пишет), если смогу.

+0

Пожалуйста, покажите свой код. Вы действительно хотите заблокировать доступ только для записи? Считывание из базы данных может возвращать ложные данные, если они разблокированы. Вы обновляете несколько таблиц? – Borodin

+0

@Borodin - Верно, я бы предпочел блокировать все чтения и записи, если смогу. Я редактировал сообщение с кодом. Спасибо за вашу помощь. – user2026318

ответ

0

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

+0

Я отредактировал код, чтобы добавить инструкцию insert и проверить идентификатор @@. Это также безопасно, учитывая мои настройки? Есть ли способ явно заблокировать всю базу данных от чтения и записи с использованием Perl? Я бы предпочел сделать это, если смогу. Спасибо. – user2026318

+0

Единственный вариант, который я знаю, это открыть базу данных _exclusive_, но это требует, чтобы ни один другой процесс не открывал файл. – Gustav

+0

Это всего лишь несколько пользователей, и загрузка занимает всего минуту, так что, вероятно, это сработает. Я рассмотрю, как блокировать исключительно использование perl dbi: odbc с драйвером MS Access, но если вы случайно знаете, возможно, вы можете указать мне в правильном направлении. – user2026318

Смежные вопросы