タグ付けされた質問 「transactions」

それらのいずれかが成功するためにすべて成功する必要がある相互に関連する操作のセット。操作が失敗すると、トランザクションのすべての操作がロールバックされます。

10
MongoDBでのトランザクションの不足を回避するにはどうすればよいですか?
同様の質問がここにあることは知っていますが、トランザクションが必要な場合、またはアトミック操作または2フェーズコミットを使用する場合は、通常のRDBMSシステムに切り替えるように指示しています。2番目のソリューションが最良の選択のようです。3つ目は、多くの問題が発生する可能性があり、あらゆる面でテストすることができないため、フォローしたくありません。アトミック操作を実行するためにプロジェクトをリファクタリングするのに苦労しています。これが私の限られた視点から来たのか(これまでSQLデータベースでしか作業していない)のか、それとも実際に実行できないのかはわかりません。 弊社でMongoDBをパイロットテストしたいと思います。私たちは比較的単純なプロジェクト、つまりSMSゲートウェイを選択しました。私たちのソフトウェアがSMSメッセージをセルラーネットワークに送信することを可能にし、ゲートウェイは、実際にはさまざまな通信プロトコルを介してプロバイダーと通信するという汚い仕事をします。ゲートウェイは、メッセージの請求も管理します。サービスを申請するすべての顧客は、いくつかのクレジットを購入する必要があります。システムは、メッセージが送信されると自動的にユーザーの残高を減らし、残高が不足している場合はアクセスを拒否します。また、私たちはサードパーティのSMSプロバイダーのお客様であるため、独自の残高を提供する場合もあります。それらも追跡する必要があります。 複雑さを軽減する場合(外部請求、キューSMS送信)、MongoDBで必要なデータを保存する方法について考え始めました。SQLの世界から来て、ユーザー用の別のテーブル、SMSメッセージ用の別のテーブル、およびユーザーのバランスに関するトランザクションを格納するためのテーブルを作成します。MongoDBのすべてのコレクションを個別に作成するとします。 この簡略化されたシステムで次の手順を実行するSMS送信タスクを想像してください。 ユーザーに十分なバランスがあるかどうかを確認します。十分なクレジットがない場合はアクセスを拒否します 詳細とコストを含むSMSコレクションにメッセージを送信して保存します(ライブシステムではメッセージにstatus属性があり、タスクは配信のためにそれを取得し、現在の状態に応じてSMSの価格を設定します) 送信されたメッセージのコストによってユーザーのバランスを減らす トランザクションをトランザクションコレクションに記録する それで問題は何ですか?MongoDBは、1つのドキュメントに対してのみアトミック更新を実行できます。前のフローでは、なんらかのエラーが発生し、メッセージがデータベースに格納されても、ユーザーの残高が更新されなかったり、トランザクションがログに記録されなかったりする場合があります。 私は2つのアイデアを思いつきました: ユーザーの単一のコレクションを作成し、残高をフィールドとして保存し、ユーザー関連のトランザクションとメッセージをユーザーのドキュメントのサブドキュメントとして保存します。ドキュメントをアトミックに更新できるため、実際にはトランザクションの問題が解決されます。短所:ユーザーが多数のSMSメッセージを送信すると、ドキュメントのサイズが大きくなり、4MBのドキュメント制限に達する可能性があります。そのようなシナリオで履歴ドキュメントを作成できるかもしれませんが、これは良い考えではないと思います。また、同じ大きなドキュメントにさらに多くのデータをプッシュすると、システムがどのくらい高速になるかわかりません。 ユーザー用とトランザクション用に1つのコレクションを作成します。トランザクションには、正の残高変更のあるクレジット購入と負の残高変更のある送信メッセージの 2種類があります。トランザクションにはサブドキュメントがある場合があります。たとえば、送信されたメッセージでは、SMSの詳細をトランザクションに埋め込むことができます。欠点:現在のユーザーの残高は保存しないので、ユーザーがメッセージを送信しようとするたびに計算して、メッセージが通過できるかどうかを判断する必要があります。保存されたトランザクションの数が増えると、この計算が遅くなる可能性があります。 どの方法を選択するかについて少し混乱しています。他の解決策はありますか?これらの種類の問題を回避する方法に関するオンラインのベストプラクティスを見つけることができませんでした。NoSQLの世界に慣れようとするプログラマーの多くは、最初は同様の問題に直面していると思います。

12
「ロック待機タイムアウトを超えました。「スタックした」Mysqlテーブルのトランザクションを再起動してみてください。
スクリプトから、このようなクエリを何千回もローカルデータベースに送信しました。 update some_table set some_column = some_value where部分を追加するのを忘れたので、同じ列がテーブル内のすべての行の同じaの値に設定され、これは何千回も実行され、列にインデックスが付けられたので、対応するインデックスがおそらく何度も更新されました。 時間がかかりすぎたため、問題が発生したため、スクリプトを強制終了しました。それ以来、コンピューターを再起動しましたが、単純なクエリの実行に非常に長い時間がかかり、関連するインデックスを削除しようとすると、次のメッセージが表示されて失敗するため、テーブルに何かが詰まっています。 Lock wait timeout exceeded; try restarting transaction これはinnodbテーブルなので、トランザクションのスタックはおそらく暗黙的です。このテーブルを修正してスタックしたトランザクションを削除するにはどうすればよいですか?

2
MS SQL Server Management Studioでトランザクションを操作する最良の方法
構文的にも意味的にも正しいSQLステートメントがあるとしましょう。 Management Studio(またはその他のクエリツール)でSQLステートメントをテストするにはどうすればよいですか。また、SQLステートメントが何かを壊したことに気付いた場合は、(別のクエリで)ロールバックします。
127 sql  tsql  transactions 

2
SELECT…FOR UPDATEを使用する場合
背後のユースケースを理解するのを手伝ってくださいSELECT ... FOR UPDATE。 質問1:次のSELECT ... FOR UPDATE使用例は良い例ですか? 与えられた: 部屋[id] タグ[ID、名前] room_tags [room_id、tag_id] room_idとtag_idは外部キーです アプリケーションは、すべての部屋とそのタグをリストする必要がありますが、タグのない部屋と削除された部屋を区別する必要があります。SELECT ... FOR UPDATEを使用しない場合、次のことが起こります。 最初は: 部屋には [id = 1] タグに含まれる [id = 1, name = 'cats'] room_tagsには [room_id = 1, tag_id = 1] スレッド1: SELECT id FROM rooms; returns [id = 1] スレッド2: DELETE FROM room_tags …


6
MySQL:トランザクションとテーブルのロック
データベースの整合性を確保し、SELECTとUPDATEの同期を維持し、他の接続が干渉しないようにするために、トランザクションとテーブルのロックを少し混同しています。する必要がある: SELECT * FROM table WHERE (...) LIMIT 1 if (condition passes) { // Update row I got from the select UPDATE table SET column = "value" WHERE (...) ... other logic (including INSERT some data) ... } 他のクエリが干渉してそれを実行しないようにする必要がありますSELECT(その接続が行の更新を完了する前に「古い値」を読み取ります)。 私はデフォルトLOCK TABLES tableで、一度に1つの接続のみがこれを実行していることを確認し、完了したらロックを解除することもできますが、それはやり過ぎのようです。トランザクションでそれをラップすることは同じことを行いますか(他の接続がまだ処理している間に他の接続が同じプロセスを試行しないことを保証します)?またはでしょうSELECT ... FOR UPDATEかSELECT ... LOCK IN SHARE MODE良いかも?

3
JPA / Hibernateでのflush()の正しい使用
私はflush()メソッドに関する情報を収集していましたが、それをいつ使用し、どのように正しく使用するかについては明確ではありません。私が読んだことから、私の理解は、永続化コンテキストの内容がデータベースと同期される、つまり、未解決のステートメントを発行したりエンティティデータを更新したりすることです。 今、私は2つのエンティティAとB(1対1の関係で、JPAによって強制またはモデル化されていない)以下のシナリオを取得しました。A手動で設定される複合PKがあり、自動生成されたIDENTITYフィールドもありますrecordId。これrecordIdはへBの外部キーとしてエンティティに書き込む必要がありますA。私は、1つのトランザクションで保存AしBています。問題は、自動生成された値があることをA.recordId、私はの明示的な呼び出しを行う場合を除き、トランザクション内では使用できませんem.flush()呼び出した後em.persist()にA。(自動生成されたIDENTITY PKがある場合、値はエンティティで直接更新されますが、ここではそうではありません。) em.flush()トランザクション内で使用すると害が生じる可能性がありますか?



4
読み取り専用操作でHibernateのトランザクションが必要なのはなぜですか?
読み取り専用操作でHibernateのトランザクションが必要なのはなぜですか? 次のトランザクションはDBにロックをかけますか? DBからフェッチするコードの例: Transaction tx = HibernateUtil.getCurrentSession().beginTransaction(); // why begin transaction? //readonly operation here tx.commit() // why tx.commit? I don't want to write anything session.close() 代わりに使用できますtx.commit()か?

5
dapper.netでトランザクションを使用する方法?
複数のテーブルで複数の挿入ステートメントを実行したいと思います。私はdapper.netを使用しています。dapper.netでトランザクションを処理する方法がわかりません。 トランザクションの使用方法に関するアイデアをdapper.netと共有してください。
106 c#  transactions  dapper 

3
トランザクション分離レベルとテーブルのロックの関係
私は4レベルの分離について読みました: Isolation Level Dirty Read Nonrepeatable Read Phantom Read READ UNCOMMITTED Permitted Permitted Permitted READ COMMITTED -- Permitted Permitted REPEATABLE READ -- -- Permitted SERIALIZABLE -- -- -- 各トランザクションの分離がテーブルに対して行うロックを理解し たい READ UNCOMMITTED - no lock on table READ COMMITTED - lock on committed data REPEATABLE READ - lock on block …

4
SQL Server 2000データベースで開いているトランザクションを一覧表示する方法はありますか?
SQL Server 2000データベースで開いているトランザクションを一覧表示する方法を知っている人はいますか? sys.dm_tran_session_transactionsSQL 2005以降のデータベースバージョンのビューをクエリできることは承知していますが、SQL 2000では使用できません。

2
TransactionScopeはどのようにトランザクションをロールバックしますか?
複数のオブジェクトをデータベースに挿入する統合テストを作成していて、メソッドがそれらのオブジェクトを取得するかどうかを確認しています。 データベースへの接続はNHibernateを介して行われます。そのようなテストを作成するための通常の方法は次のようにすることです。 NHibernateSession.BeginTransaction(); //use nhibernate to insert objects into database //retrieve objects via my method //verify actual objects returned are the same as those inserted NHibernateSession.RollbackTransaction(); しかし、最近この目的に使用できると思われるTransactionScopeについて最近知りました... 私が見つけたいくつかのサンプルコードは次のとおりです: public static int AddDepartmentWithEmployees(Department dept) { int res = 0; DepartmentAdapter deptAdapter = new DepartmentAdapter(); EmployeeAdapter empAdapter = new EmployeeAdapter(); using (TransactionScope …

12
読み取りトランザクションをコミットまたはロールバックする必要がありますか?
分離レベルを指定できるように、トランザクション内で実行する読み取りクエリがあります。クエリが完了したら、どうすればよいですか? トランザクションをコミットします トランザクションをロールバックする 何もしない(トランザクションがusingブロックの最後でロールバックされる原因になります) それぞれを行うことの意味は何ですか? using (IDbConnection connection = ConnectionFactory.CreateConnection()) { using (IDbTransaction transaction = connection.BeginTransaction(IsolationLevel.ReadUncommitted)) { using (IDbCommand command = connection.CreateCommand()) { command.Transaction = transaction; command.CommandText = "SELECT * FROM SomeTable"; using (IDataReader reader = command.ExecuteReader()) { // Read the results } } // To commit, or not to …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.