問題タブ [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 投票する
4 に答える
4105 参照

c# - 未処理の例外の後、C# Mysql Connector を使用して AutoCommit を無効にする

現在、バックエンド データベースとして MySql を使用して C# アプリケーションを開発しています。

残念ながら、説明できない有線の動作が見つかりました。

トランザクションを使用して、複数のクエリを「結合」して、すべてのコマンドのみが実行されるか、何も実行されないようにしたいと考えていました。

しかし、私のコーディングミスにより、トランザクション中に未処理の例外が発生しました。

トランザクションについての私の理解は、そのような場合、トランザクションはロールバックされるということです。

それにもかかわらず、未処理の例外によるクラッシュのために、Mysql はデフォルトで AutoCommit を有効にして、切断後にコミットするように見えることがわかりました。

だから私は実行してそれを無効にしようとしましたSET autocommit = 0

しかし、これはうまくいきません。

編集: 次のコードを使用してトランザクションを作成しました:

他の人は、BEGIN を使用するとこの問題が解決するはずだと言いましたが、そうではありません。Mysql ログでは、次のクエリが実行されます。

もちろん、未処理の例外が発生しないようにコードを修正する必要がありますが、Mysql がこれを行うのを防ぐ方法はありますか?

ありがとう!

クリス

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

git - Git で特定のファイルの自動ステージを無効にする方法

リポジトリの一部にしたいファイルがありますが、commit -a通常使用するコマンドを実行するたびにその変更をコミットしたくはありませんが、ステージング領域に手動で追加する場合にのみ行います。

Gitで可能ですか?

わかりやすくするために、これはバイナリの「出力」ファイル (スプレッドシート) であり、データの処理方法に関するいくつかのロジックも含まれているため、保存されたデータではなくロジック/構造を変更した場合にのみコミットしたいと考えています。

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

java - コミットを使用してすべてのクエリを保存する方法と、いずれかのクエリが失敗した場合、データを保存する必要はありません

私は従業員フォームを持っています.タブ付きペインを使用して4つの異なるタブを取得しました.しかし問題は、最初のタブにデータを保存すると、データベースにのみ保存されることです. 他のタブにデータを保存する前に、フォーム全体を閉じたので、データベースには最初のタブからのエントリがあり、他のタブにはデータが保存されていません...以降のプロセスでエラーが発生します。コミットについては知っていますが、どこでどのように使用するのかわかりません???? フォームのすべてのタブからデータベースにすべてのデータを保存する必要があり、その間にフォームが閉じられた場合、データは保存されません...助けてください。

私はJavaプログラミングでそれを望みます.and各タブのデータは、最後ではなく独自のページに保存します。

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

php - コミットまたはロールバックは、PHPのmysqliで暗黙的に自動コミットをオンにしますか?

PHPでmysqliクラスを使用してトランザクションを実行していますが、autocommit()のドキュメントがひどく不完全であることがわかりました。例から、autocommitをfalseに設定すると、「トランザクションの開始」が暗黙的に実行されることが推測されます。これは正しいです?さらに重要なのは、自動コミットがtrueにリセットされる場所がわからないことです。これは、トランザクションの完了後に行われるはずだと思います。commit()またはrollback()メソッドが呼び出されたときに、これは自動的に発生しますか?

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

python - SQLINSERTおよびPythonとSQLでの「コミット」後に新しい行が表示されない

Pythonでループを作成し、それ自体を呼び出してデータベース内の新しいエントリを繰り返しチェックしました。最初の実行時に、影響を受けるすべての行が正常に表示されます。その間、データベースに行を追加します。ループ内の次のクエリでは、新しい行は表示されません。

これは私のクエリループです:

これは私のPython挿入スクリプトのSQL部分です:

SQLiteを試し、Oracle MySQLのコネクタを試し、WindowsおよびLinuxシステムでMySQLdbを試しましたが、すべて同じ問題が発生しました。私は、 SQLステートメント(例: 1、2、3 )の後に自動コミットをオンにするかcommit()を使用することを推奨する、Stackoverflowの多くのスレッドを調べましたが、試行して失敗しました。

HeidiSQLを使用してデータベースにデータを追加すると、ループクエリに表示されましたが、これがなぜであるかはよくわかりません。Linuxでmysql-clientを使用して挿入された行と、Python挿入スクリプトは、ループスクリプトを再起動するまで表示されません。

それぞれ独自のスクリプトで2つの接続を開いたのかどうかはわかりませんが、接続が完了したら、すべての接続とすべてのカーソルを閉じます。

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

java - mysql jdbcの失敗したロールバック

JDBC を使用して MySQL データベースに接続する Java コードがいくつかあります。その後、コードはいくつかの読み取り操作を実行してから、すべて同じ接続を使用して 1 回の更新を実行します。例外がある場合は、 thenconnection.rollback()が呼び出されます。例外がなければconnection.commit()呼び出されます。この段階で、テストを実行するたびに接続が新しく作成されます (つまり、接続はプールからのものではありません)。私のコードは 1 つの接続のみを作成し、テスト全体で使用されます。

使用中の接続connection.setAutoCommit(false)は、接続インスタンスが作成された直後に呼び出されました。

何らかの理由で、例外が発生しconnection.rollback()て呼び出されると、更新がロールバックではなくコミットされていることがわかります。

デバッグにより、以下を確認しました。

  • を呼び出した後、予想どおり の値connection.setAutoCommit(false)connection.getAutoCommit()返しますfalse。また、予想どおり、自動コミットがオフであることを示す"Select @@session.autocommit"の値を返します。0

  • を呼び出す直前にconnection.rollback()、予想どおり、自動コミットがオフになっていることが同じチェックで示されます。

  • connection.commit()は確実に呼び出されておらず、connection.rollback()確実に呼び出されています。

また、ステートメントを明示的に実行しようと"rollback;"しましたが、問題は解決しません。"Set AUTOCOMMIT = 0;"また、接続を作成した後にステートメントを明示的に実行しようとしました。

私のテーブルはすべて InnoDB のストレージ エンジンを使用しています。自動コミットをオフにして SQL Workbench を使用すると、ロールバックとコミットが期待どおりに機能します。

MySQL バージョン '5.0.91-community-nt' を使用しています。MySQL jdbc ドライバーのバージョンは 5.1.19 です。私はJava 5を使用しています。

自動コミットがオフになっていて、コミットが呼び出されず、ロールバックが明示的に呼び出されているにもかかわらず、更新がコミットされる理由について何か提案はありますか?

乾杯。

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

grails - リスト内の要素の位置が変更されたときに更新クエリを起動する grails autocommit

オブジェクトを配列リストの先頭に移動する必要があるシナリオがあります。

今、私はこのようなものを持っています

obj4 をリストの先頭に移動するには、次のようにリストから削除します

そして、コレクションを逆にします

私がこれを行っているとき、grailsはいくつかのオブジェクトに対して更新クエリを自動的に起動しています

私が試した別の方法は、新しいリストを作成してから、このような要素を追加することです

しかし、この場合、複数の更新クエリが発生しています。私はオブジェクトにまったく触れていません。

これをデバッグするのを手伝ってください

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

mysql - OpenJPA + Tomcat JDBC 接続プール = 古いデータ

Web アプリケーションで OpenJPA とともに Tomcat JDBC 接続プールを使用しています。アプリケーションは、更新されたデータを認識しません。具体的には、別の Java アプリケーションがデータベースにレコードを追加または削除しますが、Web アプリケーションはこれらの更新を認識しません。これはかなり深刻な問題です。基本的なものが欠けているに違いありません。

実装から接続プールを削除すると、Web アプリケーションは更新を認識します。あたかも Web アプリケーションのコミットが接続で呼び出されないかのようです。

バージョン情報:

Tomcat JDBC 接続プール: org.apache.tomcat tomcat-jdbc 7.0.21

OpenJPA: org.apache.openjpa openjpa 2.0.1

以下は、DataSource (DataSourceHelper.findOrCreateDataSource メソッド) を作成するコード フラグメントです。

以下は、DataSource を使用して EntityManagerFactory を作成するコードです。

そのように DataSource をコメントアウトすると、機能します。OpenJPA には、DataSource を使用せずに接続を構成するための十分な情報が props に含まれていることに注意してください。

どういうわけか、OpenJPA と接続プールの組み合わせが正しく機能していません。

アップデート:

実際、基盤となるデータベースが MySQL の場合は失敗するようです。基礎となるデータベースが DB2 の場合、プールの有無にかかわらず正しく動作します。

更新#2:

JdbcInterceptor をプールに追加して、接続で呼び出されるメソッドをログに記録しました。データベースが DB2 の場合、EntityManager の作成時に setAutoCommit(true) が呼び出されます。データベースが MySQL の場合、呼び出されません。

これにより、動作の違いが説明されます。アプリケーションが EntityManager で commit を呼び出している場合でも、対応するコミットが Connection にありません。トランザクション中に実行されるクエリはすべて読み取り専用であるため、OpenJPA ではコミットは必要ないと考えているようです。

MySQL からのログは次のとおりです。

以下は DB2 からのログです (setAutoCommit に注意してください)。

この発見以来、EntityManagerFactory を作成する前に、autoCommit を true に設定しようとしました。

これは効果がありません。OpenJPA が autoCommit を false に設定する、stackoverflow に関する他の投稿を読みました。ログでこれを見ましたが、データベースへの更新を含むトランザクションをコミットする場合のみです。

最近、transactionIsolationLevel を調べたところ、DB2 が 2 であるのに対し、MySQL のデフォルト レベルは 4 であることがわかりました。これは、java.sql.Connection クラスからのこれらの定義です。2 は 4 よりもさらにリラックスしているため、おそらくこれが原因ではないことに注意してください。

0 投票する
3 に答える
12830 参照

postgresql - Postgresが自動コミットをグローバルにオフに設定する

グローバルレベルでpsql 8.4で自動コミットをオフにするにはどうすればよいですか? 自動コミットをオフにして db セッションを開始するために、クラスター上のすべての db にこの動作を導入する、変更できる構成属性はありますか?

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

php - 複数の関数を使用する場合の MYSQL 自動コミット

これをできるだけ簡単にするようにします。関数で throw/catch を使用しています。この関数は、名前、説明、およびユーザーの配列を受け取ります。名前と説明を 1 つのテーブルに追加し、ユーザーの配列を取得して、それらをコネクタ テーブルに追加するための別の関数を実行します。最後のユーザーが入力されるまで自動コミットをオフにしてからコミットするように機能を設定しました。問題は、(外部キー制約のために) ユーザーの 1 人がログインに失敗した場合、トランザクションがバックアウトされないことです。別の関数を呼び出しているという事実は、自動コミットを「リセット」し、意図したとおりに機能しませんか? ロールバックを Catch 句に入れて間違っていますか?

コードを単純化しすぎていないことを願っています。どんな助けでも大歓迎です。