DB:「トランザクション」と「デッドロック問題」




トランザクション

トランザクションとは、データに対する一つの論理的な操作することです。データベースの操作について、トランザクションを重視する理由は複数人での更新のケースにデータ更新の並列性を保つこと、及び障害発生時にデータの整合性を保障することを可能になるリカバリーです。
つまり、データベースのACID特性を実現することです。
  • 原子性(atomicity)
  • 一貫性(consistency)
  • 独立性(isolation)
  • 永続性(durability)

1. 原子性(atomicity)

トランザクション内での更新作業中に障害発生等で更新を中断した時に更新前の状態にまでロールバックすることです。

A. トランザクションからのロールバック

  • 更新する資料が間違いた
  • ユーザーの暗証番号が間違いた
  • ユーザから更新を中断する 

B. データベースからのロールバック

  • データベースがオーバーロードした
  • デッドロックが発生した

2. 一貫性 (Consistency)

トランザクション前後のデータは整合性を保ちます。もっと簡単といえば、AがBに100円を渡す時、Aの口座には100円が減ったのに、Bの口座には100円が増えないという状況から避けることです。

3.独立性 (Isolation)

データベースのロックによる排他制御があります。それは同一のデータに対して複数のスレッドが操作をする可能性があるとき(複数人のユーザーが操作するとき)、データの整合性を保つため、複数のスレッドが同一のデータを操作しないように制御することです。

4. 永続性(Durability)

これはサーバーがフリーズした(ロールバック指示がない)場合、サーバーが再起動する時にデータベースがTransaction Logを利用して、自動的にトランザクションをロールバックすることを判断することです。

デッドロック問題

障害時のリカバリを迅速に行う、整合性を保証する、トランザクションはかなにいい提案ですが、これはシングルユーザーだけでの話です。マルチユーザーの場合は、複数のトランザクションが同時に同じデータを更新することが可能です。それで、デッドロックという問題が発生します。
デッドロックとは、2つ以上のプログラムが資源の解放を待っていることです。通常はタイムアウトで処理をやり直しますが、DBの設計にはロックの順番を統一する方法もあります。テーブルの間がまたがってる場合、テーブル順をソートします。参照と更新処理をまぜないようにします。
ちなみに、MySQLは親切です。同じDB内のデッドロックを検知したら、自動的にロールバックにしてロックを解除してくれますよ。

0 留言:

發佈留言