<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>devkuma – Transaction</title>
    <link>https://www.devkuma.com/jp/tags/transaction/</link>
    <image>
      <url>https://www.devkuma.com/jp/tags/transaction/logo/180x180.jpg</url>
      <title>Transaction</title>
      <link>https://www.devkuma.com/jp/tags/transaction/</link>
    </image>
    <description>Recent content in Transaction on devkuma</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>jp</language>
    <managingEditor>kc@example.com (kc kim)</managingEditor>
    <webMaster>kc@example.com (kc kim)</webMaster>
    <copyright>The devkuma</copyright>
    
	  <atom:link href="https://www.devkuma.com/jp/tags/transaction/index.xml" rel="self" type="application/rss+xml" />
    
    
      
        
      
    
    
    <item>
      <title>Database Index (インデックス)</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/index/</link>
      <pubDate>Sun, 19 Dec 2021 01:05:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/index/</guid>
      <description>
        
        
        &lt;h2 id=&#34;インデックスindexとは&#34;&gt;インデックス(index)とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;テーブルに対する動作速度を高めるデータ構造を指す。&lt;/li&gt;
&lt;li&gt;インデックスは、テーブル内の 1 つのカラム、または複数のカラムを使って作成できる。&lt;/li&gt;
&lt;li&gt;高速な検索動作だけでなく、レコードアクセスに関連する効率的な並び順付けの基盤も提供する。&lt;/li&gt;
&lt;li&gt;インデックスとは、追加の書き込み処理と保存領域を利用して、データベーステーブルの検索速度を向上させるためのデータ構造である。&lt;/li&gt;
&lt;li&gt;もし本の中で目的の内容を探すとしたら、本のすべてのページを探すには長い時間がかかる。そのため本の著者は本の先頭または末尾に索引を追加するが、データベースの index は本の索引と同じである。&lt;/li&gt;
&lt;li&gt;データベースでも、テーブルのすべてのデータを検索すると時間がかかるため、データとデータの位置を含むデータ構造を作成し、高速に照会できるようにしている。&lt;/li&gt;
&lt;li&gt;index を適用していないカラムを照会すると、全体を探索する Full Scan が実行される。Full Scan は全体を比較しながら探索するため速度が低下する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;データベースでデータを検索する-2-つの方法&#34;&gt;データベースでデータを検索する 2 つの方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;FTS(Full Table Scan)
&lt;ul&gt;
&lt;li&gt;テーブルを最初から最後まで検索する方法である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Index Scan
&lt;ul&gt;
&lt;li&gt;インデックスを検索し、該当データのテーブルへアクセスする方法である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;インデックスのデータ構造&#34;&gt;インデックスのデータ構造&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;ハッシュテーブル&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;カラム値から生成されたハッシュを基にインデックスを実装する。&lt;/li&gt;
&lt;li&gt;時間計算量が O(1) であるため検索が非常に速い。&lt;/li&gt;
&lt;li&gt;不等号（&amp;lt;, &amp;gt;）のような連続データに対する順次検索はできない。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;B+Tree&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;子ノードが 2 つ以上ある B-Tree を改善したデータ構造である。&lt;/li&gt;
&lt;li&gt;BTree のリーフノードを LinkedList で接続し、順次検索を容易にした。&lt;/li&gt;
&lt;li&gt;ハッシュテーブルより悪い O(log2n) の時間計算量を持つが、ハッシュテーブルより一般的に使用される。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
      <category>Transaction</category>
      
    </item>
    
    <item>
      <title>Database Transaction (トランザクション)</title>
      <link>https://www.devkuma.com/jp/docs/rdbms/transaction/</link>
      <pubDate>Sun, 19 Dec 2021 01:05:00 +0900</pubDate>
      <author>kc@example.com (kc kim)</author>
      <guid>https://www.devkuma.com/jp/docs/rdbms/transaction/</guid>
      <description>
        
        
        &lt;h2 id=&#34;database-transactionトランザクションとは&#34;&gt;Database Transaction(トランザクション)とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;データベースの状態を変化させるために実行する論理的な作業単位である。&lt;/li&gt;
&lt;li&gt;データベースのデータを操作する作業単位（Unit of work）である。&lt;/li&gt;
&lt;li&gt;トランザクションでは複数の演算が実行されることがある。&lt;/li&gt;
&lt;li&gt;トランザクションは、実行中に 1 つでも作業が失敗するとすべてロールバックされ、すべて成功すると commit を実行する。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transaction-acid-とは&#34;&gt;Transaction ACID とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;原子性(Atomicity)
&lt;ul&gt;
&lt;li&gt;1 つのトランザクションの作業が、その一部だけ実行されたり中断されたりしないことを保証することをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;一貫性(Consistency)
&lt;ul&gt;
&lt;li&gt;トランザクションの作業が正常に完了しても、作業前と同じ有効な状態を維持することをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分離性(Isolation)
&lt;ul&gt;
&lt;li&gt;Transaction 作業が実行されているとき、他の作業が割り込めないように保証することをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;永続性(Durability)
&lt;ul&gt;
&lt;li&gt;正常に実行されたトランザクションについては、永続的（Persistent）に反映されなければならないことをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transaction-を使用する際の注意点&#34;&gt;Transaction を使用する際の注意点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;トランザクションの範囲は最小化する。
&lt;ul&gt;
&lt;li&gt;トランザクションの範囲を最小化することが重要である。&lt;/li&gt;
&lt;li&gt;データベースのコネクション数は限定的であるため、コネクションを保持する時間を最小化する必要がある。&lt;/li&gt;
&lt;li&gt;そうしないと、他のサービスがそのコネクションを使用するために待機しなければならない状況が発生する。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;transaction-isolation-level-の種類と特徴&#34;&gt;Transaction isolation level の種類と特徴&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;READ UNCOMMITTED
&lt;ul&gt;
&lt;li&gt;SELECT クエリ実行時に、他のトランザクションで COMMIT されていないデータを読み取ることができる。&lt;/li&gt;
&lt;li&gt;COMMIT されていないデータを読む現象を Dirty read という。&lt;/li&gt;
&lt;li&gt;INSERT だけが行われ、ROLLBACK される可能性のある、つまり COMMIT されていないデータを読むことができるため注意が必要である。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;READ COMMITTED
&lt;ul&gt;
&lt;li&gt;Read Committed は、COMMIT が完了したデータだけが SELECT 時に見えるレベルを保証するものであり、多くの DBMS では Read Committed がデフォルトに設定される。&lt;/li&gt;
&lt;li&gt;Read Committed では、Read Uncommitted で発生する Dirty read が発生しないことを保証する。&lt;/li&gt;
&lt;li&gt;トランザクションで COMMIT を実行していなくても、DB にはすでに値が反映されている状態であり、COMMIT 前のデータを保証するには、COMMIT されていないクエリを復旧する過程が必要になる。つまり、この時点では Consistent Read を実行する必要があることを意味する。&lt;/li&gt;
&lt;li&gt;Read Committed の問題は、1 つのトランザクション内で SELECT を実行するたびにデータが同一であることを保証しない点である。その理由は、他のトランザクションで該当データが COMMIT された場合、COMMIT されたデータを返すのが Read Committed の特徴だからである。&lt;/li&gt;
&lt;li&gt;このような理由から、Read Committed は Non-repeatable Read とも呼ばれる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;REPEATABLE READ
&lt;ul&gt;
&lt;li&gt;Read Committed とは異なり、Repeatable Read は 1 つのトランザクション内で繰り返し SELECT を実行しても、読み取る値が変わらないことを保証する。&lt;/li&gt;
&lt;li&gt;Repeatable Read トランザクションは、最初に SELECT を実行した時刻を記録し、その後はすべての SELECT でその時点を基準に Consistent Read を実行する。&lt;/li&gt;
&lt;li&gt;したがって、トランザクション中に他のトランザクションが COMMIT されても、新しく COMMIT されたデータは見えない。&lt;/li&gt;
&lt;li&gt;その理由は、最初の SELECT 時に生成された SNAPSHOT を読むためである。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;SERIALIZABLE
&lt;ul&gt;
&lt;li&gt;Serializable は、すべての作業を 1 つのトランザクションで処理するのと同じ、最も高い分離レベルを提供する。&lt;/li&gt;
&lt;li&gt;Read Committed、Repeatable Read の 2 つに共通する問題は、Phantom Read が発生する点である。
&lt;ul&gt;
&lt;li&gt;Phantom Read とは
&lt;ul&gt;
&lt;li&gt;1 つのトランザクションで UPDATE 命令が失われたり上書きされたりする、つまり UPDATE 後に COMMIT して再度照会したとき、予想とは異なる値が見えたりデータが失われたりした場合を Phantom Read という。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;それとは異なり、SERIALIZABLE では SELECT クエリがすべて SELECT &amp;hellip; FOR SHARE に自動で変更され、Repeatable Read では防げないいくつかの状況を防止できる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;commit-と-rollback&#34;&gt;Commit と Rollback&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Commit
&lt;ul&gt;
&lt;li&gt;1 つのトランザクションが終わったとき、完了したことをトランザクション管理者に知らせる。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Rollback
&lt;ul&gt;
&lt;li&gt;1 つのトランザクション処理が異常終了して DB の一貫性を崩したとき、すべての演算を取り消すことをいう。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

      </description>
      
      <category>Database</category>
      
      <category>RDBMS</category>
      
      <category>Transaction</category>
      
    </item>
    
  </channel>
</rss>
