我应该提交以下代码吗?
should I commit in the following code?
我的代码:
122 #
123 my $hfpDbh = undef;
124 unless (
125 $hfpDbh = DBI->connect("dbi:Pg:host=....")#removed something
128 ) {
129 Log( ERROR, "" );
130 Exit( 1 )
131 }
132 $hfpDbh->{RaiseError} = 1;
133 $hfpDbh->{AutoCommit} = 0;
134
135 ( my $mydata, $msg ) = load_data( $hfpDbh, $DatFile );
136 unless ( defined($mydata) )
137 {
138 Log(INFO, "Calling exit...2");
139 }
140 #$hfpDbh->disconnect();
141 Exit( 0 );
142 Log(INFO, "Calling exit...4");
143
144
145 sub load_data
146 {
147 my ( $dbh, $DatFile ) = @_;
148 my $msg = '';
149 unless ( $dbh ) {
150 $msg = 'cannot load data, no DB handle';
151 Log( ERROR, $msg );
152 }
153 Log(INFO, "Call load_data...");
154 my $q = "SELECT ip as ip FROM rules WHERE active = 'true' AND isGood = 'true';";
155 my $stmt = undef;
156 unless ( $stmt = $dbh->prepare( $q ) ) {
157 $msg = "unable to prepare SQL query: $q";
158 Log( ERROR, $msg );
159 }
160
161 eval { $stmt->execute() };
162 if ( $@ ) {
163 $msg = "failed to execute SQL query: $@";
164 Log( ERROR, $msg );
165 }
166
167 my $data = {};
168 while ( my $row = $stmt->fetchrow_hashref() ) {
169 #Log(INFO, "testing row");
170 }
171 $stmt->finish();
172 return $data, $msg;
173 }
警告是:
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::Pg::db handle
如果我在第 171 行之后添加“$dbh->commit()”,上述警告就消失了。
如果我在第171行之后没有添加“$dbh->commit()”而是调用了“$hfpDbh->disconnect();”在第140行,上面的警告也消失了。
我的问题是:
警告表示有未提交的事务?这就是为什么我需要显式提交或断开连接以修复警告。但是代码中只有SELECT操作。我缺少什么?
谢谢。
The warning means that there are uncommitted transactions?
由于您请求使用事务,所以有一个未提交的事务,但该警告实际上是在通知您已隐式执行回滚。它会告诉您这一点,因为这可能会导致信息丢失。显然,在这种情况下不会导致信息丢失,但检查不够智能,无法意识到这一点。
What I am missing?
$hfpDbh->disconnect();
或 $hfpDbh->rollback();
因为您根本没有修改数据库,所以不需要启用事务,所以不要将 AutoCommit
设置为零。这样就不需要在任何地方调用 commit
,当句柄超出 dcope
时,数据库将自动断开连接
由于您自己处理错误,因此不应将 RaiseError
设置为 1。如果发生任何错误,这将导致您的程序立即终止,并且您自己的处理代码不会被处决
不用打电话finish
。它不会在这里造成任何伤害,但它也毫无意义,几乎永远不需要
我的代码:
122 #
123 my $hfpDbh = undef;
124 unless (
125 $hfpDbh = DBI->connect("dbi:Pg:host=....")#removed something
128 ) {
129 Log( ERROR, "" );
130 Exit( 1 )
131 }
132 $hfpDbh->{RaiseError} = 1;
133 $hfpDbh->{AutoCommit} = 0;
134
135 ( my $mydata, $msg ) = load_data( $hfpDbh, $DatFile );
136 unless ( defined($mydata) )
137 {
138 Log(INFO, "Calling exit...2");
139 }
140 #$hfpDbh->disconnect();
141 Exit( 0 );
142 Log(INFO, "Calling exit...4");
143
144
145 sub load_data
146 {
147 my ( $dbh, $DatFile ) = @_;
148 my $msg = '';
149 unless ( $dbh ) {
150 $msg = 'cannot load data, no DB handle';
151 Log( ERROR, $msg );
152 }
153 Log(INFO, "Call load_data...");
154 my $q = "SELECT ip as ip FROM rules WHERE active = 'true' AND isGood = 'true';";
155 my $stmt = undef;
156 unless ( $stmt = $dbh->prepare( $q ) ) {
157 $msg = "unable to prepare SQL query: $q";
158 Log( ERROR, $msg );
159 }
160
161 eval { $stmt->execute() };
162 if ( $@ ) {
163 $msg = "failed to execute SQL query: $@";
164 Log( ERROR, $msg );
165 }
166
167 my $data = {};
168 while ( my $row = $stmt->fetchrow_hashref() ) {
169 #Log(INFO, "testing row");
170 }
171 $stmt->finish();
172 return $data, $msg;
173 }
警告是:
Issuing rollback() due to DESTROY without explicit disconnect() of DBD::Pg::db handle
如果我在第 171 行之后添加“$dbh->commit()”,上述警告就消失了。
如果我在第171行之后没有添加“$dbh->commit()”而是调用了“$hfpDbh->disconnect();”在第140行,上面的警告也消失了。
我的问题是: 警告表示有未提交的事务?这就是为什么我需要显式提交或断开连接以修复警告。但是代码中只有SELECT操作。我缺少什么?
谢谢。
The warning means that there are uncommitted transactions?
由于您请求使用事务,所以有一个未提交的事务,但该警告实际上是在通知您已隐式执行回滚。它会告诉您这一点,因为这可能会导致信息丢失。显然,在这种情况下不会导致信息丢失,但检查不够智能,无法意识到这一点。
What I am missing?
$hfpDbh->disconnect();
或 $hfpDbh->rollback();
因为您根本没有修改数据库,所以不需要启用事务,所以不要将
AutoCommit
设置为零。这样就不需要在任何地方调用commit
,当句柄超出 dcope 时,数据库将自动断开连接
由于您自己处理错误,因此不应将
RaiseError
设置为 1。如果发生任何错误,这将导致您的程序立即终止,并且您自己的处理代码不会被处决不用打电话
finish
。它不会在这里造成任何伤害,但它也毫无意义,几乎永远不需要