【发布时间】:2018-04-02 12:36:07
【问题描述】:
我有下一个代码:
my $savepoint = $c->db->txn_scope_guard;
return $self->render( 'subnet/create', error => [ create => $@ ],
servers => $self->rows( 'Server' )->lookup,
) unless $subnet = eval{ $self->rows( 'Subnet' )->create( $subnet ) };
$savepoint->commit;
这里的 rows 是 Mojolicious 助手,它提供对数据的访问。
sub model {
my( $c, $table_name ) = (shift,shift);
return $c->db->resultset( $table_name );
}
而->db也是帮手:
sub db { return $schema
//= DBIx::Class::Schema->connect( $DB->{ DSN }, @$DB{ qw/ USER PASS / }, {
AutoCommit => 1,
RaiseError => 1,
quote_char => '"',
})
});
当我创建$subnet 并发生唯一约束时(这里不管发生哪个约束,实际上是在任何异常的情况下)我得到了错误:
DBIx::Class::Storage::DBI::_dbh_execute(): DBI Exception: DBD::Pg::st execute failed: ERROR: current transaction is aborted, commands ignored until end of transaction block [for Statement "SELECT "me"."id", "me"."hostname" FROM "servers" "me" ORDER BY hostname"] at ...
这是当我用eval{ ... } 捕获异常时,当前事务被中止,我不能做$self->rows( 'Server' )->lookup
有没有办法在异常发生后访问服务器数据?
【问题讨论】:
-
为什么不在创建前进行查找?
-
因为当用户
POST他的选择时我不需要查找数据。仅在呈现表单subnet/create时才需要查找。
标签: perl dbi dbix-class