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

一貫性のある一連の変更をアトミックにデータベースにコミットするメカニズム。

5
データベーストランザクションとロックの正確な関係は何ですか?
これは、私の知識を増やすという精神で尋ねられた謙虚な質問です。親切に対応してください。 長年のアプリケーション開発者として、私はあるレベルでトランザクションとは何かを知っています(私は常にそれらを使用しています)。トランザクションの分離レベルはさておき、高レベルでは、トランザクションは作業ブロックを完全に完了させるか、まったく完了させず、他のデータベース変更アクティビティからある程度の分離を可能にします。 また、(さまざまなデータベースで)ロックが何であるか、または少なくとも1つの動作を知っています(何らかの方法でテーブルを明示的にロックした場合、他のプロセスまたはスレッドはそのテーブルについて何も更新できません)。 私がはっきりとはっきりしていないのは、さまざまなデータベースで、行またはテーブルを明示的にロックするときに、データベースのトランザクション機能で使用されるものとまったく同じ構造を使用して、トランザクションを適切に機能させることですか? つまり、トランザクションがアトミックで分離されるためには、何らかのロックを行わなければならないことがわかります。このトランザクションによって開始された、トランザクションに隠されたロックは、さまざまなデータベースが、SELECT FOR UPDATE明示的なLOCKコマンドなどの構造を介してアクセスできるのと同じ種類のロックですか?または、これらの2つの概念は完全に異なりますか? 繰り返しますが、この質問の素朴さをおaびします。より基本的な情報源を指摘できてうれしいです。

1
OLAPおよびOLTPの「オンライン」とは正確には何ですか?
OLTPとOLAPの「オンライン」の定義に疑問を抱いているので、少し混乱しています。ここで「オンライン」とは、ある時点で利用可能なデータに基づいて、限られた時間内に答えを求めることを意味すると考えていました。 しかし、OLAPクエリの計算には数時間かかる場合があります。これはオフラインではありませんか? クイック検索では、かなり複雑に聞こえるオフラインのOLAPが示されます(オフラインのオンライン分析処理)...? 「オンライン」とは正確には何ですか?

2
アトミックトランザクションで一意の違反を回避する
PostgreSQLでアトミックトランザクションを作成することはできますか? これらの行を持つテーブルカテゴリがあると考えてください。 id|name --|--------- 1 |'tablets' 2 |'phones' また、列名には一意の制約があります。 私が試した場合: BEGIN; update "category" set name = 'phones' where id = 1; update "category" set name = 'tablets' where id = 2; COMMIT; 私は得ています: ERROR: duplicate key value violates unique constraint "category_name_key" DETAIL: Key (name)=(tablets) already exists.

4
トランザクションでテーブル構造を変更し、エラーが発生した場合にロールバックできますか?
ALTER TABLE実行中のステートメントがいくつかあります。すべてが機能するわけではありません(SQLデータ比較の実行結果です)。それらをいくつかのトランザクションにグループ化し、何か問題が発生した場合はステートメントをロールバックします。 これは可能ですか、それともロールバックできるデータのみですか?

2
postgresの遅延可能な一意のインデックス
alter tableのpostgresのドキュメントを見ると、通常の制約はDEFERRABLE(より具体的には、INITIALLY DEFERRED、これが私が興味を持っていることです)。 次の条件を満たしている限り、インデックスを制約に関連付けることもできます。 インデックスには式列を含めることも、部分インデックスにすることもできません そのため、現在、次のような条件付きの一意のインデックスを作成する方法はないと考えています。 CREATE UNIQUE INDEX unique_booking ON public.booking USING btree (check_in, check_out) WHERE booking_status = 1; であるためにINITIALLY DEFERRED(場合一意「制約」は唯一のトランザクションの最後に検証されることを、意味し、SET CONSTRAINTS ALL DEFERRED;使用されています)。 私の仮定は正しいですか、もしそうなら、意図した動作を達成する方法はありますか? ありがとう

1
C#コードおよびストアドプロシージャでトランザクションを処理する必要がありますか
データベースストアプロセスとC#の両方でトランザクション処理が本当に必要ですか? C#: Using(transaction with transaction scope) { Execute stored proc; Transaction. Complete; } SQLストアドプロシージャ: Create process As Begin try Begin transaction Commit End try Begin catch Rollback End catch

1
選択されたクエリにMySQLコミットデータが表示されない
コンテキスト:使用されるフレームワークはSpringであり、すべてのクエリはJdbcTemplateで実行されます。Mysqlサーバーのバージョンは5.6.19です。tableでありInnoDB table、デフォルトのようなauto commit分離レベル反復-読み取りが設定されていると。 問題:Insertトランザクション内で発生し、select挿入された同じデータを読み取ると、データが表示されません。select実行した後insertとした後、insertトランザクションが持ちますcommited。 mysqlでbinログと一般ログを有効にしました。以下の関連ログ bin-log: SET TIMESTAMP=1438265764/*!*/; BEGIN /*!*/; # at 249935389 #150730 14:16:04 server id 1 end_log_pos 249935606 CRC32 0xa6aca292 Query thread_id=40 exec_time=0 error_code=0 SET TIMESTAMP=1438265764/*!*/; insert into user_geo_loc_latest(user_id, lat, lng) values(x,y,z) on duplicate key update lat=y, lng=z /*!*/; # at 249935606 #150730 14:16:06 server id 1 end_log_pos …

1
Postgresでは、現在定義されているセーブポイントのリストを取得する方法は?
現在のトランザクション内に新しいセーブポイントを作成するpostgres SAVEPOINTを使用しており、接続で現在定義されているセーブポイントのリストを表示したいと思います。 より正確に言うと、どの名前が接続で「no such savepoint」エラーを引き起こさないかを確認したいと思います。

1
MySQL:トランザクションは行をロックしますか?
これまでにMySQLトランザクションを使用したことはありません。何かを明確にしたいだけです。 2人のユーザーが正確な時間にクエリを実行した場合、MySQLはこれをどのように処理しますか?たとえば、ユーザーがレコードを更新しようとしています。 user1:テーブルセットの更新column = column-4 where column_id = 1; user2:テーブルセットを更新しますcolumn = column-7 where column_id = 1; トランザクションを使用する場合、MySQLは最初に実行されるクエリを選択し、最初のクエリがコミットされるまで2番目のユーザーをロックしますか?それはテーブルロックですか、それとも行ロックですか? 3番目のユーザーがselectステートメントを発行するとどうなりますか?MySQLが返す値は何ですか? PSこれはInnodbにあります。

1
トランザクションIDラップアラウンド後にxminとtxid_current()を比較する方法は?
通常の列に加えて、Postgresテーブルにはさまざまなシステム列があります。そのうちの1つはxmin、行の作成に使用されるトランザクションIDを格納します。そのデータ型はxid、ある時点で折り返す4バイトの整数です(つまり、必ずしも一意ではありません)。この関数txid_current()は、現在のトランザクションIDを返しますbigintが、「インストール中にラップしないように「エポック」カウンターで拡張されるため」として、マニュアルを引用します。 トランザクションのラップアラウンドがまだ発生していない場合、両方の値が一致しているようです: # CREATE TABLE test (label text); CREATE TABLE # INSERT INTO test VALUES ('test') RETURNING txid_current(); txid_current -------------- 674500 (1 row) INSERT 0 1 # SELECT xmin FROM test; xmin -------- 674500 (1 row) しかし、私は疑問に思う:これらの2つの値は常に同等ですか?私の知る限り、txid_current()トランザクションIDのラップアラウンド(最大2 ^ 32トランザクション)後も一意の値を配信し続けxmin、ゼロから開始します。これは、両方がその時点で異なる値を返し始めることを意味しますか? そして、これが当てはまる場合xid、txid_current()結果を規則的に抽出xminして、テーブル内のエントリと一致するようにする方法はありますか(たとえばtxid_current()、整数へのキャスト)。 編集:トランザクションIDのラップアラウンドの後、2 ^ 32トランザクションのかなり前に起こる可能性が非常に高いことを気にかけていることを明確にします。コメントでこれを指摘してくれたDanielVéritéに感謝します。

1
JDBCで明示的なコミットを無効にする、SQLで検出する、またはデータベースを読み取り専用状態にする
背景:私はhttp://sqlfiddle.com(私のサイト)に取り組んでおり、そこで悪用される可能性のある1つの手段を防止しようとしています。私が現在取り組んでいる問題について尋ねることによって、潜在的な虐待を不注意に悪化させないことを望んでいますが、あなたは何ができますか?皆さんを信頼しています。 任意のユーザーが特定のトランザクションブロック内で明示的な「コミット」呼び出しを発行することを防止したいと思います。SQL Fiddleのコンテキストから見ると、トランザクションブロックは右側のパネルで実行されるコードです。基本的に、ループしてプレーンテキストのSQLコマンドのリストを実行し、それらの変更がすべてバッチの最後に確実にロールバックされるようにします。通常、それらの変更はロールバックされますが、テキスト内に明示的な「コミット」ステートメントがある場合があるため、もちろん私のロールバックは機能しません。この明示的なコミットは、SQL Fiddleでスキーマを壊そうとするユーザーによるものである可能性が高いため、他のユーザーがエラーを確認します。 主な望ましい結果:可能であれば、JDBCレベルで明示的なコミットを無効にします。これは、複数のデータベースバックエンドベンダーをサポートする必要があるためです。もちろん、それぞれのベンダーには低レベルの癖があります。 フォールバックオプション:明示的なコミットを無効にするようにJDBCを構成できない場合、SQL Server、Oracle、MySQL、およびPostgreSQLの各バックエンドのバッチを処理中に明示的なコミットを検出するためのソリューションを利用できます。 SQL Serverの場合、このソリューションを考えました。実行する前にステートメントのXMLクエリプランを解析し、このXPathに一致するエントリの存在を確認します。 //*[@StatementType="COMMIT TRANSACTION"] これはSQL Serverでかなりうまくいくと思います。ただし、このアプローチは他のDBタイプでは機能しません。明示的なコミットに関するOracleのXML実行計画の出力は、コミットステートメントを実行しているという事実を参照していません(むしろ、コミットしているクエリから実行計画の出力を単純に繰り返します)。PostgreSQLおよびMySQLは、明示的なコミットに対して実行計画の出力(XMLまたはそれ以外)を一切提供しません。 そのため、「コミット」という単語の実際のステートメントを確認できます。これは機能しますが、可能なすべての種類のバリエーションがある場合を除きます。 declare @sql varchar(50) set @sql = 'com' + 'mit' exec(@sql); 上記はSQL Serverの例です(回避できます)が、Oracle、MySQL、PostgreSQLでも同様のことが可能だと思います。私はその仮定で間違っていますか?たぶん、彼らは「動的な」コミット文を許可しないでしょうか?Oracle、MySQL、PostgreSQLで同様のことができるかどうかを確認するために、SQL Fiddle(できればサンプルスキーマまたは他の誰かが作業している可能性のあるものではない)を自由に使用してください。そうでない場合は、単純な文字列の検出が機能する可能性があります。 さらに別の可能性 別のオプションがありました-これらのデータベースのいずれかを読み取り専用モードに設定する方法を知っている場合、そのモードでは何もコミットできませんが、それも機能します。そのモードで何もコミットできない限り、トランザクションの開始とトランザクション内でのコードの実行を許可する必要があります。それは可能ですか? 更新 私が最近学んだこと-これは実際にはPostgreSQLの問題ではありません。トランザクションブロック内で発行されたコミットは、その同じブロックが最終的に(Postgresで)ロールバックされた場合には適用されないようです。Postgresの皆さん、ありがとう! PhilのSO投稿へのリンクのおかげで、DEFERRABLE INITIALLY DEFERREDハックを使用してOracleを達成できると思います(コミットが発行されるとエラーがスローされますが、それを回避できます)。これはOracleに対処する必要があります。(ネストされたトランザクションがここで機能するかもしれないと少しの間考えましたが、Oracleがネストされたトランザクションをサポートしているようには見えませんか?とにかく、このように機能するものは見つかりませんでした)。 MySQLのソリューションはまだありません。ネストされたトランザクションを使用してみましたが、動作しないようです。右側のSELECT以外は許可しない、または各クエリの後にDBを削除/再作成するなど、MySQLのより抜本的なアプローチを真剣に考えています。どちらも良い音ではありません。 解決 したがって、SQL ServerとOracleについて説明したソリューションを実装しましたが、前述したように、これは実際にはPostgreSQLの問題ではありません。MySQLの場合、クエリパネルをselectステートメントのみに制限するというやや不幸なステップを踏んでいます。MySQLのDDLとDMLは、スキーマパネル(左側)で入力するだけです。これがあまりにも多くの古いフィドルを壊さないことを願っていますが、それは単にデータの一貫性を確保するために行わなければならないことだと思います。ありがとう!

2
ストアドプロシージャでのトランザクション
単一のトランザクションでUPDATEとINSERTを実行する必要があります。そのコードはそれ自体で問題なく機能しますが、簡単に呼び出して必要なパラメーターを渡すことができるようにしたいと思います。このトランザクションをストアドプロシージャにネストしようとすると、多くの構文エラーが発生します。 次のコードをカプセル化して簡単に呼び出せるようにするにはどうすればよいですか? BEGIN TRANSACTION AssignUserToTicket GO DECLARE @updateAuthor varchar(100) DECLARE @assignedUser varchar(100) DECLARE @ticketID bigint SET @updateAuthor = 'user1' SET @assignedUser = 'user2' SET @ticketID = 123456 UPDATE tblTicket SET ticketAssignedUserSamAccountName = @assignedUser WHERE (ticketID = @ticketID); INSERT INTO [dbo].[tblTicketUpdate] ([ticketID] ,[updateDetail] ,[updateDateTime] ,[userSamAccountName] ,[activity]) VALUES (@ticketID, 'Assigned ticket to …

2
InnoDBはコミットする前にトランザクションデータをどこに格納しますか?
私は、JDBCテクノロジーを使用して、自宅でいくつかのテストをREAD_COMMITTED行いREAD_UNCOMMITTEDました。 READ_UNCOMMITTED実際にコミットされていないデータ、たとえばまだコミットされていないトランザクションからのデータを読み取ることができることがわかります(UPDATEクエリを実行できます)。 ご質問 READ_UNCOMMITTEDトランザクションがコミットされていないデータを別のトランザクションから読み取ることができるように、コミットされていないデータはどこに保存されますか? READ_COMMITTEDトランザクションがコミットされていないデータを読み取ることができない、つまり「ダーティリード」を実行できないのはなぜですか。この制限を強制するメカニズムは何ですか?

3
MSSQLで開かれたトランザクションが長すぎるとどのような影響がありますか?
DBでトランザクションを開始し、それをコミットまたはロールバックするのを忘れた場合、どうなるのかと思っています。サーバーはダウンしますか?3日間放置したとしましょう。 他のユーザーが閉じられていないトランザクションがあることを知らなかったと仮定してそれを使用しているユーザーもいます(ユーザーがデータベースにデータを挿入していると仮定しましょう)。このアクションの結果は何ですか?

1
SQL Serverの「チェックポイント時にログを切り捨て」オプション
長い話ですが、私たちの長期コンサルタント(元従業員)は、Tivoli Storage Managerとのインターフェースを取るためにカスタムスクリプトを数年(2006年ほど)書いており、という名前のSQL Server DBオプションをチェックしているようtruncate log on checkpointです。彼らの主張は、SQL 2012であるインスタンスでスクリプトが機能し、バックアップを実行することを妨げているということです。 私はそのようなオプションを見つけることができずsp_configure、バックアップが1つのインスタンスを除いてどこでも機能しているので、それは完全なBSだと感じています。しかし、それがそうであるなら、私は地雷を取り除き、他の時代遅れの要素を取り除きたいと思います。ベンダーに確認してもらっていますが、彼らの言うことにはあまり自信がありません。 私が行った調査では、SQL 2000またはSybaseのオプションの1つであると考えられます。もう1つの主張は、復旧モデルがSIMPLE存在し、それをオンまたはオフにする明示的なオプションがない場合、それが以降のバージョン(2008以降)で暗黙的に呼び出される/使用されるというものでした。 TRUNCATE LOG最近のトランザクションログのしくみが原因でこのコマンドは廃止されているため、現時点ではクエリを実行できるオプションではないと思います。 私はSQL Server 2000のインスタンスを持っていないので、誰かがこれを思い出したり、置いてあるものでそれをチェックしたりできることを望んでいました。それは私が推薦できるものではないことを彼らに話しました。私はまた、誰かがこれが時代遅れであることを確認できることを望んでいました。

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