Мой код:Должен ли я зафиксировать в следующем коде?
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 ([email protected]) {
163 $msg = "failed to execute SQL query: [email protected]";
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
Если добавить "$ dbh-> коммит()" после того, как линия 171, выше предупреждают исчез.
Если после строки 171 не было добавлено «$ dbh-> commit()», вызывается «$ hfpDbh-> disconnect();» в строке 140 вышеупомянутое предупреждение также исчезло.
Мой вопрос: Предупреждение означает, что есть незафиксированные транзакции? Вот почему мне нужно зафиксировать или отключить явно, чтобы исправить предупреждение. Но в коде есть только операция SELECT. Что мне не хватает?
Спасибо.
Ваша обработка ошибок немного неудобна. Вы уже включаете 'RaiseError', поэтому вам не следует проверять успех каждого метода вручную. 'RaiseError' генерирует исключение, если есть ошибка. Если вы хотите использовать собственный обработчик ошибок (например, для регистрации ошибок), используйте ['HandleError'] (https://metacpan.org/pod/DBI#HandleError). – ThisSuitIsBlackNot
@ikegami, но disconnect() будет откатываться по незафиксированным транзакциям? Я прав? Если я не вызвал функцию load_data(), предупреждение исчезнет, даже если я не отключился. – BAE
Кроме того, вы не должны называть 'finish', и вы должны убедиться, что' disconnect' вызывается даже тогда, когда есть исключение или сигнал (например, с блоком 'END' и обработчиком сигналов). – ThisSuitIsBlackNot