我想在Perl上的sqlite数据库上的特定时间做VACUUM,但它总是说
DBD::sqlite::db do Failed: cannot VACUUM from within a transaction
那我该怎么做?
my %attr = ( RaiseError => 0,PrintError => 1,AutoCommit => 0 ); my $dbh = DBI->connect('dbi:sqlite:dbname='.$file'','',\%attr) or die $DBI::errstr;
我正在使用AutoCommit => 0.错误发生在:
$dbh->do('DELETE FROM soap'); $dbh->do('DELETE FROM result'); $dbh->commit; $dbh->do('VACUUM');
解决方法
我假设你有AutoCommit =>连接调用中为0,因为以下工作原理:
#!/usr/bin/perl use strict; use warnings; use DBI; my $dbh = DBI->connect('dbi:sqlite:test.db',undef,{ RaiseError => 1,AutoCommit => 1} ); $dbh->do('VACUUM'); $dbh->disconnect;
您不必放弃能够进行VACUUM的事务:您可以使用以下内容以便为VACUUM打开AutoCommit,并在VACUUM之后将AutoCommit状态恢复为它的状态.如果未设置RaiseError,请添加错误检查.
sub do_vacuum { my ($dbh) = @_; local $dbh->{AutoCommit} = 1; $dbh->do('VACUUM'); return; }
叫它:
do_vacuum($dbh);