How to lock an Access database against writes

时间:2015-08-10 20:53:21

标签: perl ms-access odbc ms-access-2013

I can't find the answer to this question and it's hard to be sure by experimenting.

I am bulk loading multiple tables into a Microsoft Access database using Perl with DBIDBD::ODBC。所有查询都在单个事务中完成,该事务在加载结束时提交(或在错误时回滚)。数据库处于多用户环境中。

理想情况下,我想锁定数据库,以便在我的加载过程中没有其他进程可以进行任何更改,这只会持续大约一分钟,并且每天运行一次。这很重要的一个原因是,有时在加载过程中我必须查看@@identity以获取我刚刚插入的记录的自动编号ID。

  • 我的设置应该用于记录锁定?我目前正在使用

    Default Open Mode – Shared
    Default record locking – Edited Record
    
  • 事务是否会锁定整个数据库以防止写入,直到它被提交为止?如果没有,是否有办法使用DBI::ODBC锁定所有写入?

通过实验,我可以看出Access正在为我做一些锁定,但我无法确定它是否完全锁定。

更新:代码如下所示:

#!/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语句中,所以如果它发出错误,我会回滚而不是提交。

如果可以的话,我宁可锁定所有内容(读写)。

1 个答案:

答案 0 :(得分:0)

我不认为你有问题。您的流程附加的记录的ID不会被其他流程窃取。