如何锁定 Access 数据库以防止写入
How to lock an Access database against writes
我找不到这个问题的答案,也很难通过实验来确定。
我正在使用带有 DBI
and DBD::ODBC
的 Perl 将多个表批量加载到 Microsoft Access 数据库中。所有查询都在单个事务中完成,该事务在加载结束时提交(或因错误回滚)。数据库处于多用户环境中。
理想情况下,我想锁定数据库,以便其他进程无法在我的加载过程中进行任何更改,加载过程只持续大约一分钟,并且每天 运行 一次。这很重要的一个原因是有时在加载期间我必须查看 @@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 语句中,所以如果它踢出一个错误,我会回滚而不是提交。
如果可以的话,我宁愿锁定一切(读写)。
我认为你没有问题。您的进程附加的记录的Id不会被其他进程窃取。
我找不到这个问题的答案,也很难通过实验来确定。
我正在使用带有 DBI
and DBD::ODBC
的 Perl 将多个表批量加载到 Microsoft Access 数据库中。所有查询都在单个事务中完成,该事务在加载结束时提交(或因错误回滚)。数据库处于多用户环境中。
理想情况下,我想锁定数据库,以便其他进程无法在我的加载过程中进行任何更改,加载过程只持续大约一分钟,并且每天 运行 一次。这很重要的一个原因是有时在加载期间我必须查看 @@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 语句中,所以如果它踢出一个错误,我会回滚而不是提交。
如果可以的话,我宁愿锁定一切(读写)。
我认为你没有问题。您的进程附加的记录的Id不会被其他进程窃取。