DBIでSQLiteのテーブルを舐めて、レコードを更新したい。

sub TransGender {
 my $sth = $dbh->prepare('SELECT id, name, sex FROM Person;');
 $statusHandle->execute;
 while(my @row = $statusHandle->fetchrow_array) {
  my ($id, $name, $sex) = @row;
  $sex = ($sex eq 'male') ? 'female' : 'male';
  my $updh = $dbh->prepare('UPDATE Person WHERE id=? SET sex=?;');
  $updh->execute($id, $sex);
 }
}

以下の警告が出て更新出来なかった。
DBD::SQLite::st execute failed: database table is locked(1) at dbdimp.c

この場合まずIDを問い合わせて配列に格納し、
今度はIDから一つ一つデータを問い合わせて$sth->finish()した後に更新するの?
なんか定石みたいなのってありますかね。