2

いくつかの試行を実行しましたが、に設定autocommitすると速度がいくらか向上するようFalseです。

ただし、コードの最後で1つのコミットを実行すると、データベースの行が更新されないのではないかと心配しています。したがって、たとえば、データベースに対していくつかの更新を行いますが、コミットされたものはありません。データベースにクエリを実行すると、古いデータが得られますか?または、最初にコミットする必要があることを知っていますか?

それとも、私はcommit実際に何をしているのか完全に間違っていますか?

注:私はpyodbcとMySQLを使用しています。また、私が使用しているテーブルはInnoDBですが、違いはありますか?

4

3 に答える 3

2

暗黙のコミットをトリガーする状況がいくつかあります。ただし、ほとんどの場合、コミットしないということは、他の接続でデータを利用できないことを意味します。

また、別の接続が進行中のトランザクションと競合するアクションを実行しようとした場合(別の接続がそのリソースをロックした場合)、最後の要求はロックが解放されるのを待つ必要があります。

パフォーマンスの問題に関しては、autocommitすべての変更を即座に行います。commit各インデックスと制約も更新/チェックする必要があるため、パフォーマンスの低下は大きなテーブルで非常に顕著になります。一連のクエリの後でのみコミットする場合、インデックス/制約はその時点でのみ更新されます。

一方、十分な頻度でコミットしないと、サーバーが2つのデータセット間の整合性を維持しようとして多くの作業を行う可能性があります。したがって、トレードオフがあります。

そして、はい、使用InnoDBすると違いが生じます。たとえばMyISAM、トランザクションをまったく使用していない場合、変更は永続的になります(autocommit = Trueと同様)。MyISAMでは、delay-key-writeオプションで遊ぶことができます。

取引の詳細については、公式ドキュメントをご覧ください。最適化に関するその他のヒントについては、この記事を参照してください。

于 2012-05-29T16:37:19.333 に答える
1

InnoDBのデフォルトのトランザクションモードはREPEATABLEREADであり、すべての読み取りはトランザクション内で一貫しています。行を挿入して同じトランザクションでクエリを実行すると、新しく挿入された行は表示されませんが、トランザクションをコミットすると保存されます。
トランザクションをコミットする前に新しく挿入された行を確認したい場合は、分離レベルをREADCOMMITTEDに設定できます。

于 2012-05-29T16:36:28.110 に答える
0

同じ接続を使用している限り、データベースは、たとえばこのトランザクションでこれまでに行われたすべての変更を含む、データの一貫したビューを表示する必要があります。

コミットすると、変更はディスクに書き込まれ、他の(新しい)トランザクションと接続に表示されます。

于 2012-05-29T16:23:57.307 に答える