問題タブ [autocommit]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
2850 参照

java - Hibernate と MySQL を使用した実行時の変更の自動コミット

Glassfish 3.1.2.2 で実行されている Hibernate (3) と MySQL (5.5) で奇妙な問題が発生しています。単一のサーバー呼び出しのコンテキスト内で実行時に自動コミット フラグの状態が変化しています。同じスレッド。私はそれを明示的に変更しているわけではなく、最近突然始まりました。この領域のコードは大幅に変更されていません。

私が使用しているコードにはさまざまなデータ アクセス方法があり、それぞれが同じパターンに従います。

  1. Hibernate セッション ファクトリから現在のセッションを取得する
  2. 取引開始
  3. アップデートを実行
  4. トランザクションをコミットする
  5. ステップ 3 と 4 は try/catch にあり、例外が発生した場合、トランザクションはロールバックされます。

このようなメソッド呼び出しの最初の 2 回では、自動更新フラグは false ( getDefaultSession().connection().getAutoCommit()) ですが、3 回目以降はすべて、フラグが突然 true になり、どのように/なぜ変更されたかは示されません。フラグが true の場合にコミットをスキップするために、いくつかのメソッドに回避策のコードを追加する必要がありましたが、これは最近発生し始めたばかりの問題であり、すべてのメソッドを更新することはできません。

また、そのスレッド ID が次回セッションを取得したときに、状態が true として開始されるため、自動コミット フラグが現在のセッションで確実に true として保存されることも問題です。そのスレッドで次に使用されるデータ アクセス メソッドに回避策のコードがない場合、例外がスローされ、状態が false に戻ります。繰り返しますが、明示的なコードはありません。

いえ

  1. スレッド 1、方法 1
    1. DAO 1: 自動コミット false
    2. DAO 2: 自動コミット false
    3. DAO 3: 自動コミット true
    4. DAO ...n: 自動コミット true
  2. スレッド !1、メソッドの自動コミット false
  3. スレッド 1、メソッド
    1. DAO x: 自動コミット true
    2. 例外
    3. DAO y: 自動コミット false

Hibernate 構成で自動コミットを有効/無効にする方法について多くのスレッドを見つけましたが、次の構成項目があります。

<property name="hibernate.connection.autocommit">false</property>

複数のスレッドを使用するとフラグが true に変更される可能性があることを示すスレッドもいくつか見つかりましたが、これらのメソッドはすべて (変更が発生した前後で) 同じ初期メソッドから同じスレッド内で呼び出されています (ThreadID に基づいて確認) Glassfish ログで)。

JDBC URL のリラックス自動コミット フラグについて読みましたが、そもそもなぜそれが起こっているのかを突き止めたいと思います。最後の手段として、すべてのコードを変更する必要がないように、そうする必要があるかもしれません。

まじで混乱…

0 投票する
1 に答える
150 参照

mysql - 共有環境での MYSQL AutoCommit

私は、社内の多くの人が共有するサーバーで作業しています。サーバーには複数の DB があり、私はサーバーを制御していません。

システム管理者は、autocommit を false に設定してデフォルトを設定しました。これにより、PHPMYADMIN を使用しようとすると問題が発生します。

サーバー上の他の DB に影響を与えることなく、autocommit を安全に true に設定できますか? はいと思いますが、間違った場合の影響は他のユーザーに悪影響を与える可能性があります.

0 投票する
1 に答える
785 参照

spring - トランザクション終了前のSpringコミット

Spring 2.5.2 から 4.0.5.RELEASE にアップグレードしようとしていますが、Spring のトランザクション管理が機能しなくなっていることがわかりました。

本番アプリでは、すべてのデータベース操作は @Transactional アノテーション (デフォルト設定) でマークされた Spring Bean を経由します。数年間、これは期待どおりに機能し、RuntimeException がトランザクション境界内でスローされた場合にロールバックが発生しました。ただし、Spring 4.0.5.RELEASE にアップグレードすると、autocommit が true に設定されているように動作します。

スタック トレースを調べて、問題のコードがまだトランザクション プロキシ内で実行されていることを確認しました。しかし、トランザクションに入った直後にテーブルに対して単純な 1 行の更新を実行すると、更新はcommitされます。Spring のバージョンを変更しただけなので、これは不可解です。

自動コミットの動作は、後の Spring バージョンで変更されましたか? 4.05 で行う必要がある追加の構成はありますか?


トランザクション マネージャーの構成は次のとおりです (2.52 と 4.05 の両方のバージョンで同じ)。

コードに @Transactional メソッドを持つ Bean を次に示します。

アプリケーション コンテキストを作成してトランザクション Bean を取得し、それを静的変数として保存する方法は次のとおりです。

その Bean を静的変数に保存し、トランザクションを実行するときに参照します。何か違うことをするべきですか?


トランザクションを開始したいときは、次のように呼び出します。

これは、トランザクションを開始するために DataSourceExecutorBean で呼び出すメソッドです。基本的には、内部データ ソースをエグゼキューター (実際にデータベースの作業を行うコード) に渡すだけです。


2 つのバージョンのログを再確認したところ、4.0.5 (壊れた) バージョンには、2.5.2 バージョンにはないいくつかのエントリがあることに気付きました。これらのエントリは、トランザクションが開始されるとすぐに表示されます。

2014-07-31 09:34:43,576 [btpool0-0] DEBUG - シングルトン Bean 'efmsDataSource' の共有インスタンスを作成しています 2014-07-31 09:34:43,576 [btpool0-0] DEBUG - Bean 'efmsDataSource' のインスタンスを作成しています2014-07-31 09:34:43,576 [btpool0-0] デバッグ - Bean 'efmsDataSource' を熱心にキャッシュして、潜在的な循環参照を解決できるようにする

おそらく、これで何が起こっているかが説明されます (理由ではありません)。シングルトン データ ソース Bean は実際には singleton ではないようです。Google では、同様の問題を抱えている人が何人か表示されていますが、解決方法は示されていません。これは誰かとベルを鳴らしますか?

0 投票する
1 に答える
179 参照

mysql - MySQL ユーザー定義関数は、それらを呼び出すステートメントの自動コミット トランザクションの一部ですか?

いくつかの InnoDB (またはその他のトランザクション対応) テーブルと、MyFunction()戻り値を計算する過程でそれらのテーブルから読み取りまたは書き込みを行うユーザー定義関数があるとします。

さらに、自動コミットが有効になっているとします (つまり、MySQL はデフォルトの方法で動作しています)。

(たとえば)ステートメントを発行した場合:

すべてのテーブル アクセス (明示的な更新some_tableと読み取り/書き込みの両方)MyFunction()単一のトランザクションの一部ですか?

また

各 DML ステートメント内の個々のステートメントはMyFunction()、実行時に自動コミットされますか? その後、キャッシュされた変更がsome_table別の別のトランザクションとして適用されますか?

また

...他の何か?

MySQL のドキュメントを読みましたが、何かを見逃しているか、この問題について明確ではありません。自動コミットをオンにすると、「テーブルを更新 (変更) するステートメントを実行するとすぐに、MySQL は更新をディスクに保存して永続的にします」と述べています。しかし、(a) 変更についてのみ説明し、(たとえば) SELECTs の行ロックまたは分離レベルについては説明していません。(b) さらに重要なことに、ユーザー定義関数 (それはデータを変更する DML ステートメントを含む) は、いくつかの包含ステートメント内から呼び出されます。

MySQLの専門家である誰かが明確にしてもらえますか? ありがとう。

0 投票する
1 に答える
103 参照

jdbc - 自動コミット無効DB接続の取得

「info」パラメーターでautocommit = falseをDriverManager.getConnection(String url、Properties info)に渡し、デフォルトで自動コミットが無効になっているdb接続を取得する方法があるかどうかを知りたいです。接続を取得して setAutocommit を false に呼び出すことができることはわかっていますが、これが達成可能かどうかを知りたいです。

0 投票する
1 に答える
693 参照

mysql - ミラー テーブル: トリガー、デッドロック、暗黙のコミット

A と B など、2 つの同様のテーブルがあります。A への挿入を B に複製し、B への挿入を A に複製して、2 つのユーザー システムを統合したいと考えています。それぞれに「トリガーの挿入後」を構成しました。例:

Aに挿入すると、トリガーはBの挿入を呼び出しますが、この挿入はBでトリガーを実行し、デッドロックが発生して無限ループを回避します。

トリガーを編集して、INSERT を実行する前に別のテーブル トリガーを DROP し、その後にもう一度 CREATE しようとしました。例:

ただし、CREATE は暗黙的なコミットを行うデータ定義言語 (DDL) ステートメントです。したがって、これはできません。

コミットを明示的に処理するために、内部に DROP を指定して PROCEDURE を呼び出そうとしましたが、それもできません。

この 2 つのテーブルをミラーリングするための提案はありますか?


更新: Bill Karwinの 提案を使用して、各テーブルにフィールドを追加originし、それぞれのデフォルト値AまたはB. 次に、次のようにトリガーを変更 (DROP および reCREATE) します。

A のトリガー:

B のトリガー:

0 投票する
2 に答える
1088 参照

java - Java sqliteの自動コミットが遅い

背景: Netbeans で Java を使用しています。

CSV ファイルから行を読み取り、それらを SQLite データベースに挿入しています。私が考える非常に基本的なもの。このサイトや他の場所で見つかった例から、次のコードを作成しました。それは機能しますが、それがどれほど遅いかを見て驚いています。46 行をデータベースにロードするのに 3.95 秒かかります。Netbeans プロファイラーを使用すると、autoCommit() が 3.7 秒という時間の大半を占めていることがわかります。

私は何を間違っていますか?それとも、これは MySQL の代わりに SQLite を使用することの単なるペナルティですか?

}

0 投票する
1 に答える
5395 参照

postgresql - postgreSQL ストアド プロシージャを 1 つのトランザクションとして実行する

私は PostgreSQL 9.3 を使用しており、いくつかのステートメントを含むいくつかのストアド プロシージャを作成しています。プリペアド ステートメントを使用して、Java アプリケーションでこのストアド プロシージャを呼び出しています。

ここで、ストアド プロシージャ内の各ステートメントがトランザクションとして実行されることを読みました。つまり、各ステートメントの後に 1 つのコミットです。しかし、私が望むのは、ストアド プロシージャ全体を 1 つのトランザクション、つまり 1 つのコミットのみとして実行することです。

これどうやってするの?おそらくJDBCレベルで自動コミットを無効にしていますか?

0 投票する
0 に答える
3174 参照

spring - Spring jdbc トランザクションがコミットされない

次のSpring構成があります:

データベースとトランザクション管理を備えた Bean は、次のように構成されます。

DocDaoImplclassupdateDataは interface からメソッドを実装しますDocDao:

autocommit オプションを false に設定しているためdataSource、両方の batchUpdates 操作がエラーなしで終了した場合にのみ、トランザクションがコミットされると予想されます。残念ながら、両方の更新がエラーなしで終了しない限り、コミットは実行されず、データベースに変更は見られません。どうしたの ?@Transactional アノテーションが機能せず、コミットが実行されないのはなぜですか?