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

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

1
このwhileループで明示的なトランザクションが必要ですか?
SQL Server 2014: 非常に大きな(1億行)テーブルがあり、その上のいくつかのフィールドを更新する必要があります。 ログシッピングなどの場合も、一口サイズのトランザクションを維持する必要があります。 以下を少し実行してからクエリをキャンセル/終了すると、これまでに行われた作業はすべてコミットされますか、いつでもキャンセルできるように明示的なBEGIN TRANSACTION / END TRANSACTIONステートメントを追加する必要がありますか? DECLARE @CHUNK_SIZE int SET @CHUNK_SIZE = 10000 UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' where deleted is null or deletedDate is null WHILE @@ROWCOUNT > 0 BEGIN UPDATE TOP(@CHUNK_SIZE) [huge-table] set deleted = 0, deletedDate = '2000-01-01' …

2
INSERT INTOで新しく作成された宛先テーブルの後にROLLBACKが機能しない
私は、CSVファイル(customers.csv)をMySQLテーブル(customers)にインポートするPHPスクリプトに取り組んでいます。 mysqlテーブルにCSVファイルの内容を挿入する前に、最初に元のcustomersテーブルをバックアップしています。 mysqlトランザクションでインポートプロセス全体(バックアップを含む)をラップしています(CSVが途中で破損している場合を考慮し、インポートがアトミックであることを確認するため)。 問題は、ステートメントの直後にROLLBACKを呼び出したときにROLLBACKが機能しないように見えることですINSERT INTO。phpMyAdminを介してデータベースをチェックすると、新しく作成されたテーブルとROROW INSIDE ITがroollback後も存在していることがわかります。 操作のログは次のとおりです。 [2015-01-19 14:08:11] DEBUG: "START TRANSACTION" [] [] [2015-01-19 14:08:11] DEBUG: SHOW TABLES LIKE :table_name; [] [] [2015-01-19 14:08:28] DEBUG: CREATE TABLE `customers__20150119_14_08_20` LIKE `customers` [] [] [2015-01-19 14:08:37] DEBUG: INSERT INTO `customers__20150119_14_08_20` SELECT * FROM `customers` [] [] [2015-01-19 14:08:50] DEBUG: "ROLLBACK" …

1
1つのトランザクションで同じレコードが複数回更新された場合、いくつのバージョンが保存されますか?
Kimberly L. TrippによるMSDNの記事によると、Neal Gravesの「SQL Server 2005行バージョン管理ベースのトランザクション分離」 "... 特定のレコードの以前のバージョンはすべて、リンクリストにチェーンされています。また、長時間実行される行のバージョン管理ベースのトランザクションの場合、トランザクション的に一貫したバージョンにアクセスするには、アクセスごとにリンクをたどる必要があります。行」 これは、「行バージョニングを使用してコミットされた読み取りでの行バージョニング」と「スナップショット分離での行バージョニング」の両方のセクションに共通する「行バージョニングについて」セクションにあります。 さらに、変更による行のバージョン管理の例では、SNAPSHOTのみの複数のトランザクション(T1、T2、T3)による同じレコードの複数の更新のコンテキストで説明されています。 1つのトランザクションのみがレコードを複数回(複数のステートメントによって)更新する場合、複数のバージョンストアが保存(リンク)されますか、それともスナップショット「イメージ」の時点で取得されたもののみが取得されますか? まあ、この質問への答えはすぐに私のその他の保留中の関連する質問に答えるはずです: 行バージョン管理分離では、レコードのバージョンのリンクリストを使用するのはなぜですか? RCSIはSNAPSHOTより少ないか同じスペースを使用しますか?どうして?

1
請求書の生成と追跡
2週間ごとに、システムは会社の請求書を生成します。 会社は毎月1日と16日に請求書を受け取ります。(2週間ごとにCron Jobを介して実行されます。注文テーブルをスキャンし、「請求書」テーブルに追加します。別の方法はありますか?) 表には顧客の注文のリストがあり、ordersそれが所属する会社も示しています(orders.company_id) invoiceテーブルには、からの注文の総コスト計算orders表を。 私は、合理的な請求書追跡を設計する方法を理解しようとしています。会社によっては料金を送ってくれる場合もあれば、料金を送ってくれる場合もあります(invoice.amount) 次のもので請求書を追跡する必要があります。 会社が私に金額を送ったとき いつ会社に送金しましたか 会社から受け取った金額 会社にいくら送ったか 全額を受け取りましたか(受け取っていない場合、DBで何を更新する必要がありますか?) 請求書のステータス(送信済み、キャンセル済み、受領済み金額、送信済み金額) ここに私が思いついたデータベース設計があります: 会社のテーブル mysql> select * from company; +----+-----------+ | id | name | +----+-----------+ | 1 | Company A | | 2 | Company B | +----+-----------+ 顧客は私のウェブサイトから会社を選択できます。 注文表 mysql> select * from orders; +----+---------+------------+------------+---------------------+-----------+ | id …

2
データベースは、トランザクションのどの時点でインデックスを更新しますか?
インデックスとトランザクションの両方が関与する挿入のイベントのシーケンスを理解しようとしています。 たとえば、Oracleのドキュメントには次のように記載されています。 データをロードする前に1つ以上のインデックスを作成[または保持]している場合、データベースは各行が挿入されるたびにすべてのインデックスを更新する必要があります。 しかし、トランザクションを作成し、5つの行を挿入してからコミットするとどうなりますか?挿入ごとにインデックスが更新されますか、それともコミットポイントで更新されますか? これらのレコードがコミットされるまで、更新されたインデックスはおそらく使用できないため、ロジックはそれらがコミットポイントでのみ更新されることを教えてくれます。しかし、それは本当ですか? もしそうなら、挿入する行が1mある場合、最高のパフォーマンスを得るには、100kレコードの10トランザクションではなく、すべての行の1つの大きなコミットを実行する必要がありますか?もちろん、これは、999,999行が失敗した場合にロールバックが大きくなるリスクがあることを理解しています。 私の専門用語が少し出ていればお詫びします。私は貿易ではDBAではありません。私は特定のデータベースにはあまり関心がありません。データベース全般についてですが、私が最もよく使用しているのはOracleとPostgresです。私はこのトピックについて検索しましたが、決定的な答えは本当に見つかりません。

1
トリガーを使用した同期
私は以前の議論と同様の要件を持っています: 単純な銀行スキーマの作成:残高を取引履歴と同期させるにはどうすればよいですか? トランザクションと組み合わせたトリガー 私は2つのテーブルを持っています、[Account].[Balance]そして[Transaction].[Amount]: CREATE TABLE Account ( AccountID INT , Balance MONEY ); CREATE TABLE Transaction ( TransactionID INT , AccountID INT , Amount MONEY ); [Transaction]テーブルに対して挿入、更新、または削除がある場合、に[Account].[Balance]基づいてを更新する必要があり[Amount]ます。 現在、私はこの仕事をするきっかけを持っています: ALTER TRIGGER [dbo].[TransactionChanged] ON [dbo].[Transaction] AFTER INSERT, UPDATE, DELETE AS BEGIN IF EXISTS (select 1 from [Deleted]) OR EXISTS (select 1 …

1
SQL Serverはいつロックを取得しますか?
ここにあるSQL Serverの分離レベルのリストには、トランザクション内で取得された書き込みロックは、トランザクションが終了するまで保持されることが記載されています。ただし、これらのロックがいつ取得されるかについては触れられていません。 ロックはデフォルトでトランザクションの開始時に取得されますか、それとも必要なときに取得されますか?後者が当てはまる場合、Xのロックが保持される時間を最小限に抑えるために、大規模なトランザクションでは書き込み操作をできるだけ遅く実行する方が有利でしょうか。

1
トランザクションにSelectステートメントを置く
これら2つのクエリの違いは何ですか。 START TRANSACTION; SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; COMMIT; そしてトランザクションなし: SELECT * FROM orders WHERE id=1; UPDATE orders SET username='John' WHERE id=1; SELECTトランザクション内での影響は何ですか? 場合はDELETE FROM orders WHERE id=1、右の後に別のセッションから呼び出されたSELECT両方のケースでは、ときそれが処理されるのですか?


2
保留中のトランザクションのあるMySQLテーブルの削除
MySQLで保留中のトランザクションがあるInnoDBテーブルまたはデータベースを(できればファイルシステムレベルで)削除する方法はありますか? どうした: MySQL 5.5.28を使用して実行LOAD DATA INFILE…し、巨大なデータセット(3億行)をInnoDBテーブルにインポートしました。set autocommit = 0;以前は使用していませんでした。残念ながら、mysqldインポートの途中で中止されました。 を再起動mysqlすると、トランザクションがロールバックされ、次のようなメッセージがシステムログに記録されます。 mysqld_safe [4433]:121212 16:58:52 InnoDB:1つのアクティブなトランザクションが完了するのを待機しています 問題は、ロールバックが25時間を超えて実行されている間 mysqld、ソケット接続を受け入れていないことです。 /var/lib/mysql/*このマシンには他にもいくつかのInnoDBデータベース/テーブルがあるため、削除して最初から始めることはできません。ただし、問題のあるテーブルは、別のデータベース内の唯一のテーブルです。後ですべてのデータを再インポートできるため、テーブル全体またはデータベース全体を削除しても問題ありません。

3
トランザクションログはSQL Serverで自動的に縮小されますか?
SQL ServerデータベースがSIMPLEモードの場合、トランザクションログのバックカップを気にする必要はありません。ただし、SIMPLEモードでは、FULLモードと同様にトランザクションログが大きくなるようです。ある時点で自動的に切り捨てられますか?それとも手動で切り詰める必要がありますか?


2
commitトランザクションの前にデータをクエリする
私の理解では、MS SQL Server Management Studioウィンドウで、「トランザクションの開始」を実行してから、データをテーブルに追加するなどの変更を行った後は、そのテーブルとそれらの変更を同じウィンドウからのみ実行できます。 「トランザクションをコミットする」。 「トランザクションのコミット」を行う前に別のソースからクエリを実行する方法はありますか? 私の現在の目標に固有で、いくつかのコンテキストを追加します。Excel Power QueryからいくつかのSQLクエリを実行します。「コミットトランザクション」の前にこれらのクエリを実行して、コミットの代わりにロールバックを実行する必要があるかどうかを分析して理解できるようにしたいと思います。

3
SQL Serverは、コミットする前に、トランザクション内のトランザクションへのDDLを許可(可視化)しますか?
PostgreSQLでは、いくつかのテストデータを使用してテーブルを作成し、トランザクションでそれを別のタイプの新しい列に移行することで、1回のテーブル書き換えでCOMMIT、 CREATE TABLE foo ( a int ); INSERT INTO foo VALUES (1),(2),(3); に続く、 BEGIN; ALTER TABLE foo ADD COLUMN b varchar; UPDATE foo SET b = CAST(a AS varchar); ALTER TABLE foo DROP COLUMN a; COMMIT; ただし、MicrosoftのSQL Serverでは同じことがエラーを生成するようです。この作業の比較デシベルのフィドル、ADD(列)コマンドは、トランザクションの外にあります -- txn1 BEGIN TRANSACTION; ALTER TABLE foo ADD b varchar; COMMIT; …

4
SET TRANSACTION ISOLATION LEVEL SERIALIZABLEの後にコミットされた読み取りを追加しますか?
ストアドプロシージャの内部には、次のものがあります。(SQL Server 2008) SET TRANSACTION ISOLATION LEVEL SERIALIZABLE BEGIN TRANSACTION getStuff BEGIN TRY /* some selects, updates, etc, etc. */ .... COMMIT TRANSACTION getStuff END TRY BEGIN CATCH ... END CATCH これはトランザクションベースであるため、残りのデータベース接続はSERIALIZABLEの影響を受けないだろうと私は考えました。 コミット後にコミットされた読み取りに暗黙的に分離レベルを設定する必要がありますか?これは、アプリケーションサーバーとデータベースサーバー間の他の接続に悪影響を及ぼしますか?

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