3

データの整合性を確保するために、 DBIドライバークラスが現在トランザクションに含まれている場合にのみ実行する必要のあるメソッドがいくつかあります。私はこのようなものを書きたいと思っています:

sub m{
  my ($self , $dbh ) = @_ ;
  unless( $dbh->isInTransaction()){
     die "Use this only within a transaction\n" ;
  }
  etc ...
}

begin_workのドキュメントから、 begin_workAutoCommitはトランザクション中にオフに設定され、コミットまたはロールバック時に「オン」に戻されることを理解していますが、AutoCommit属性値のテストが安全な実装方法であるかどうか疑問に思いますisInTransaction

ご協力いただきありがとうございます。

J。

4

3 に答える 3

8

AutoCommit を有効にして $dbh->begin_work でトランザクションを開始すると、トランザクション中であるかどうかをテストできます。

if ($dbh->{BegunWork}) {

AutoCommit を無効にすると、DBI はあまり役に立ちません。データベース ハンドルに接続されたアクティブなステートメントのみを確認できます。

if ($dbh->{ActiveKids}) {

アクティブなトランザクションがあるかどうかを確認する必要はありませんでした。サポートがないことに驚きました。おそらく、DBI に関するラッパーで自分でトランザクションを追跡する (または DBI にメソッドを注入する) 必要があります。AutoCommit を無効にして BegunWork を便利に拡張することは、コア DBI 修正のように見えます。

于 2009-12-30T17:13:45.720 に答える
2

独自のラッパー クラスを作成している場合は、wrapbegin_workと他のトランザクション メソッドを使用して、独自の状態を維持できます。それ以外の場合、特に別のドライバーに切り替える必要がある場合は、文書化されていない機能または変更される可能性のある前提に依存しています。

于 2010-01-01T19:57:31.303 に答える
0

あなたのコードはデータベースに依存していませんか? AutoCommitトランザクションの処理方法に応じて、データベース間にいくつかの重要な違いがあるため、セクションを注意深く読んでください。ただし、データベースが必要な方法でトランザクションを処理することを既に知っている場合は、AutoCommit問題ありません。

于 2009-12-30T16:01:03.323 に答える