**データベーストランザクション** は、1 つ以上の SQL 操作(`INSERT`・`UPDATE`・`DELETE`・`SELECT` 等)を含む論理的な処理単位です。  
ACID 原則に従います:

- **Atomicity(原子性)** – 全ての操作が同時に成功するか、全く適用されません。
- **Consistency(一貫性)** – データベースは有効な状態から別の有効な状態へ遷移します。
- **Isolation(分離性)** – 同時実行されるトランザクション同士が互いに干渉しません。
- **Durability(永続性)** – コミットされた変更はシステム障害後も残ります。

典型的なトランザクションの流れ:

```
BEGIN TRANSACTION
   -- SQL 文
COMMIT          -- 失敗時は ROLLBACK
```

トランザクションにより、マルチユーザー環境でデータ整合性と予測可能な動作が保証されます。

2026/02/22 21:28

**データベーストランザクション** は、1 つ以上の SQL 操作(`INSERT`・`UPDATE`・`DELETE`・`SELECT` 等)を含む論理的な処理単位です。 ACID 原則に従います: - **Atomicity(原子性)** – 全ての操作が同時に成功するか、全く適用されません。 - **Consistency(一貫性)** – データベースは有効な状態から別の有効な状態へ遷移します。 - **Isolation(分離性)** – 同時実行されるトランザクション同士が互いに干渉しません。 - **Durability(永続性)** – コミットされた変更はシステム障害後も残ります。 典型的なトランザクションの流れ: ``` BEGIN TRANSACTION -- SQL 文 COMMIT -- 失敗時は ROLLBACK ``` トランザクションにより、マルチユーザー環境でデータ整合性と予測可能な動作が保証されます。

RSS: https://news.ycombinator.com/rss

要約

Japanese Translation:

概要

本文では、MySQL と PostgreSQL の 2 つの主要リレーショナルデータベースが、トランザクション、アイソレーションレベル、およびデータ整合性を実装する際に採用している内部メカニズムの違いについて説明しています。両システムとも ANSI の 4 つのアイソレーションレベル(Read Uncommitted, Read Committed, Repeatable Read, Serializable)をサポートしています。

トランザクションの基本

  • トランザクションは
    BEGIN
    で開始し、
    COMMIT;
    で終了します。
  • コミットできない場合は
    ROLLBACK;
    により、そのトランザクション内で行われたすべての変更が取り消されます。

整合性メカニズム

  • PostgreSQL: Multi‑Version Concurrency Control(MVCC)を使用。

    • 各行更新は新しいバージョンを作成し、古いバージョンの
      xmax
      と新しいバージョンの
      xmin
      にトランザクション ID を格納して、同時実行セッションでの可視性を決定します。
    • 廃棄されたバージョンは
      VACUUM FULL
      により削除されます。
  • MySQL: 古い行データを直ちに上書きしつつ、undo log(

    xid/ptr
    列付き)を保持して必要時に以前のバージョンを再構築できるようにします。これによりベーキングが減少します。

競合検出とアイソレーション

  • Serializable モードでは PostgreSQL は serializable snapshot isolation と predicate lock を採用し、ブロックせずに競合を検出します。コミット後に競合が検出された場合、トランザクションは中止され再試行する必要があります。
  • MySQL は行レベルの共有(S)および排他(X)ロックに依存します。衝突する書き込みはデッドロックを引き起こす可能性があり、エンジンは実行中のトランザクションのいずれかを終了させて解決します。

アイソレーションレベルのトレードオフ

  • 高いアイソレーションレベル(例:Serializable)は非反復読取やファントム読取を防ぎます。
  • 低いレベル(例:Read Uncommitted)は汚れた読取を許容し、パフォーマンスを向上させます。

これらの違い―トランザクション境界、MVCC vs. undo log、競合処理、および各アイソレーションレベルの意味―を理解することは、開発者が信頼性のあるアプリケーションを設計し、同時実行問題をトラブルシュートし、性能・整合性・スケーラビリティ要件に応じて適切なデータベースシステムを選択する上で不可欠です。

本文

ベン・ディッケン著 | 2026年1月14日

トランザクションは SQL データベースが動作する上での基盤です。毎日数兆ものトランザクションが、SQL データベースに依存した数千のアプリケーションで実行されています。


データベーストランザクションとは?

トランザクションは、データベースに対して一連の操作を「ひとつの原子(atomic)な操作」として実行することです。
1 つのトランザクションには、読み取り・作成・更新・削除など複数の操作が含まれる場合があります。

MySQL と PostgreSQL では、新しいトランザクションを次で開始します。

BEGIN;

そして以下で終了させます。

COMMIT;

この2つのコマンドの間に、検索やデータ操作を行う任意数の SQL クエリを実行できます。
上記例ではトランザクションが開始され、3 つのクエリが実行されたあとコミットされています。コミットは、これらすべての SQL 文で行った変更を原子性付きで適用する行為です。


トランザクションが コミットしない 場合

状況説明
予期せぬ事象(ハードディスク障害、停電など)MySQL や PostgreSQL は書き込み前ログ(WAL)などの災害復旧技術で対応します。
故意によるロールバックトランザクション途中でデータが欠落・不整合だったり、クライアントからキャンセル要求を受けた場合に
ROLLBACK;
を実行し、すべての変更を取り消します。

上記例では数回の変更後、トランザクションがロールバックされ、その結果データベースは元の状態のままとなります。


トランザクションが重要である理由

複数のクエリが同時に実行されても互いに干渉しないようにします。
同じデータベースへ接続している 2 つのセッションを想定すると:

  1. セッション A がトランザクションを開始し、データを取得・更新・再取得し、コミットする。
  2. セッション B はその同じデータをトランザクション内で 2 回取得し、その後両方のトランザクションが完了したあとにもう一度取得する。
  • セッション B はセッション A がコミットするまで、
    ben
    から
    joe
    への名前変更を見ることはありません。
  • セッション A がロールバックされた場合、セッション B はそのトランザクションの影響を全く受けません。

これは 一貫した読み取り(consistent reads)を示しています:各トランザクションはコミットされるまで外部からの変更に影響されない隔離されたビューを持ちます。
MySQL と PostgreSQL は REPEATABLE READ モード(それ以上厳格なモード)でこの保証を提供しますが、実装方法は異なります。

特徴PostgreSQLMySQL
行のバージョニング
xmin
/
xmax
メタデータ付きマルチバージョン行
Undo ログで古いデータを上書きし、即時に更新
一貫性メカニズムトランザクション ID に基づいて適切な行バージョンを読み取るUndo ログから以前のバージョンを再構築

PostgreSQL – 複数行バージョニング

  • 各更新ごとに新しい行バージョンが作成され、古いものは残ります。
  • xmin
    は作成者トランザクション ID を保持し、
    xmax
    は置換時点を示します。
  • 未コミットの変更は他トランザクションから見えません。コミット後に全員が新しいデータを見るようになります。
  • 時間とともに不要な行バージョンが蓄積し、
    VACUUM FULL
    コマンドで未使用行を削除しテーブルを圧縮します。

MySQL – Undo ログ

  • 新しい更新は古いデータを上書きしますが、Undo ログに以前の値を保持します。
  • 各行には 2 つのメタデータ列 (
    xid
    :トランザクション ID、
    ptr
    :Undo ログエントリへのポインタ) が存在します。
  • 別トランザクションが以前のバージョンを必要とするときは Undo ログから読み取ります。

隔離レベル

隔離レベルは、各トランザクションが他者によって変更されたデータをどれだけ見ることができるかを決定します。MySQL と PostgreSQL の両方で 4 つのレベル(強い順)があります。

  1. Serializable – トランザクションは順序通りに実行されているように振舞います。ロックまたは楽観的衝突解決で実現します。
  2. Repeatable Read – 非繰り返し読み取りを防止します;MySQL ではファントムリードが起こることがありますが、PostgreSQL では発生しません。
  3. Read Committed – 非繰り返しおよびファントムリードを許可しつつ、パフォーマンスを向上させます。
  4. Read Uncommitted – ダーティーリード(未コミットデータが見える)を許容する最も緩いレベルです。

主要な現象

現象定義許可されるか
ファントムリード同じ SELECT が別トランザクションのコミット済み挿入により行数が変わるRepeatable Read 以降で許容
非繰り返し読み取り別トランザクションがコミットした変更により、同一行が異なる値になるRead Committed 以降で許容
ダーティーリード他トランザクションの未コミットデータが見えるRead Uncommitted のみ許容

同時書き込み

衝突する書き込みをどう処理するかは、データベースと隔離レベルに依存します。ここでは最も厳格な SERIALIZABLE モードを例示します。

MySQL – 行レベルロック

  • 読み取りには共有(S)ロック、書き込みには排他(X)ロックを使用します。
  • SERIALIZABLE ではすべての更新が X ロックを取得し、他トランザクションは待機またはデッドロックとなります。 MySQL はデッドロックを検出し、一方のトランザクションを中止します。

PostgreSQL – Serializable Snapshot Isolation

  • 行セットに対して predicate lock(例:
    WHERE id BETWEEN 10 AND 20
    )を作成し、使用状況を追跡します。
  • 楽観的衝突解決を採用し、トランザクションはブロックされずに実行されますが、SERIALIZABLE 保証に違反する場合は中止されます。

両システムとも最終的には衝突時に一方のトランザクションを停止させるため、重要な操作ではリトライロジックを実装する必要があります。


結論

トランザクションはデータベース設計のほんの一角です。
それらが何であるか、どのように機能し、4 つの隔離レベルが保証するものを理解すれば、より効果的にデータベースを利用できます。

次に取り上げてほしいデータベース管理システムの奥深いテーマは何でしょうか? Discord コミュニティへ参加してぜひ教えてください!

Happy databasing.

同じ日のほかのニュース

一覧に戻る →

2026/02/23 4:12

私は「Timeframe」、すなわち私たち家族用の電子ペーパー・ダッシュボードを構築しました。

## Japanese Translation: 著者は長期プロトタイプを **Timeframe** に変え、カレンダー・天気・スマートホームデータを電子ペーパー画面に表示する常時稼働型ファミリーダッシュボードを作り上げました。 初期テストでは、自然光下で読みづらい Magic Mirror LCD と 30 分ごとしか更新されないジャイルブレークされた Kindle e‑ink ディスプレイから始めました。2019 年に著者は Visionect の電子ペーパー パネル(6″、10″、13″、32″)へ切り替え、単一充電で 10 分ごとに更新可能となりました。これらは Raspberry Pi 上の Ruby on Rails と IMGKit を用いて PNG を生成することで制御されました。13″ パネルの価格が 1,000 ドル、さらにデバイスあたり月額 7 ドルの新料金がかかったため、システムは高価になってしまいました。 2021 年末にマシャル火災で著者の家を失い、再建にはより信頼性の高いソリューションが必要だったため、Boox の 25.3″ Mira Pro 電子ペーパー画面(HDMI 経由でリアルタイム更新)と Mac Mini プロトタイプを採用しました。現在のディスプレイには、時計、Sonos 曲情報(node‑sonos‑http‑api を介して取得)、Dark Sky の翌時間降水予報などのリアルタイムデータが表示されます。 バックエンドは Rails/Redis から Home Assistant (HA) に書き換えられました。HA は Google カレンダー、Apple Weather、Sonos などを直接取得し、データベース層を排除します。著者は Home Assistant のテンプレートセンサー(例:食洗機のリマインダー)を追加し、コード再配備なしでアラートをトリガーできるようにしました。これにより電子ペーパー画面上で自動化されたステータスアラートが実現しました。 現在のディスプレイには左上に「ハウスヘルス」インジケーターがあり、ドアの開閉状態・ロック解除状況・洗濯完了など、必要な情報のみを表示して画面を常に確認する手間を省きます。 残っている課題は、保守不要で配備可能な組み込みハードウェアの強化、すべてのデータソースを HA に完全統合すること、および 25″ Boox の約 2,000 ドルというコストと複雑性を削減することです。著者は Timeframe を継続的に開発しつつ、潜在顧客からの関心を得て、Home Assistant アプリとして市場へ投入することを目指しています。同時に日常業務のソフトウェア作業と並行して個人的な情熱プロジェクトとして進めています。

2026/02/23 7:42

**FreeBSD 15 の新しいブリッジ機能** FreeBSD 15 では、パフォーマンスの向上・設定の簡易化・安定性の強化を実現したスリム化されたブリッジ実装が導入されました。 --- ### 主な改善点 - **低レイテンシ** を実現するために最適化されたパケット処理経路。 - ブリッジインターフェース上で直接 VLAN タギングをサポート。 - 帯域幅やキュー制限のチューニング用 `sysctl` 設定が簡素化。 - ブリッジ接続セグメント間で IPv6 フォワーディングを組み込みでサポート。 --- ### インストールと設定手順 1. **ブリッジモジュールの読み込み** ```sh kldload bridge ``` 2. **ブリッジインターフェース作成**(例:`bridge0`) ```sh ifconfig bridge0 create ``` 3. **メンバーインターフェースの追加** (`em0`, `em1`, …) ```sh ifconfig bridge0 addm em0 addm em1 up ``` 4. **IP アドレスを割り当てる(管理用に任意)** ```sh ifconfig bridge0 inet 192.168.10.1/24 ``` --- ### よくある利用ケース - L2 仮想化(例:KVM ゲストが同一ネットワークセグメントを共有) - 複数のアップリンクで冗長構成 - 追加ルーティング不要で VLAN 分割をシンプルに実現 --- ### パフォーマンス向上のヒント - NIC がサポートしている場合は `bridge_hwfilter` を有効化し、ハードウェアアクセラレーテッドフィルタリングを利用。 - トラフィックプロファイルに合わせて `bridge_maxframe` と `bridge_mtu` の `sysctl` 値を調整。 - `netstat -e` や `sockstat -4` でブリッジ統計情報をモニタリング。 --- ### トラブルシューティング - ブリッジ上のインターフェースに IP アドレス競合がないか確認。 - カーネルログ(`dmesg`)で「bridge」に関するエラーを探す。 - `ifconfig bridge0` でメンバー接続と状態を確認。 --- これらの手順を踏むことで、FreeBSD 15 の新ブリッジ機能を活用し、高性能かつ信頼性の高いネットワーク環境を構築できます。

## Japanese Translation: FreeBSD 15は、従来のVLANごとのブリッジモデルを廃止し、`vlanfilter` フラグで複数のタグ付きまたはタグなし VLAN をホストできる単一の多機能ブリッジに置き換えました。新設計では個別のブリッジが不要になり設定が簡素化されます。sysctl `net.link.bridge.member_ifaddrs` は、ブリッジメンバー上のレイヤー3アドレスをソフト非推奨にし(FreeBSD 16.0‑RELEASEで削除予定)、VLAN フィルタリングが有効でない場合はタグ付きメンバーを追加すると ``` ifconfig: BRDGSIFVLANSET ix1: Invalid argument (extended error VLAN filtering not enabled) ``` というエラーになります。 最小構成例: ``` ifconfig_ix1="up -tso4 -tso6 …" cloned_interfaces="bridge0" ifconfig_bridge0="vlanfilter addm ix1 tagged 2,3,128" ``` VNET ジャイルは `jib` スクリプト(またはカスタム `/scripts/vnetif`)を使い、epair デバイスを作成して正しい VLAN タグでブリッジに接続できます。カーネルは現在 epair 用の安定した MAC 生成 (`net.link.epair.ether_gen_addr`) を提供しているため、jib スクリプトの MAC 安定化ロジックは不要です。例として `/scripts/vnetif` は epair を作成し、IPv6 link‑local を無効にし、ポート名を付け、一方の側をタグなし VLAN 2 としてブリッジへ追加します。 Bhyve VM では手動でタップインタフェース(例: `tap133`)が事前に作成され、ブリッジに追加されます (`ifconfig bridge0 addm tap133 untagged 2`)。VM 設定はこれらのタップを参照しますが、新しいブリッジ/VLAN モデルへのネイティブサポートはありません。FreeBSD 15 の変更後は `network0_mac` フィールドが無効になるため、タップインタフェース作成時に安定した MAC アドレスを設定する必要があります。 総じて、新しいブリッジ+VLAN デザインは従来の VLAN ごとのアプローチよりも設定が簡単になり、カスタムスクリプトへの依存が減少し、ギガビット速度でのパフォーマンスが向上します(10 Gbps でも潜在的にメリットがあります)。残る懸念点としては、ルーター・オン・ア・ストック構成との互換性があります。

2026/02/23 3:56

「Loopsは、フェデレーテッド(分散型)でオープンソースなTikTokです。」

## Japanese Translation: > Loopsは、現在オープンベータ段階にある企業支配を拒否するオープンソースの分散型短編動画プラットフォームです。分散化されたアーキテクチャにより、ユーザーは単一の企業エコシステムに縛られることなく、独立したサーバ間でコンテンツを共有できます。Fediverseモデルに従い、Loopsはクリエイターとコミュニティに作品とオーディエンスデータの所有権を与えることで力を付与します。このプラットフォームはクリエイターに優しく、広告は一切含まれていません。持続可能性はユーザーによるスポンサーシップから来ており、すべての寄付は開発・インフラストラクチャー・コミュニティイニシアチブへと向けられ、Loopsが独立した状態を保つようにしています。

**データベーストランザクション** は、1 つ以上の SQL 操作(`INSERT`・`UPDATE`・`DELETE`・`SELECT` 等)を含む論理的な処理単位です。 ACID 原則に従います: - **Atomicity(原子性)** – 全ての操作が同時に成功するか、全く適用されません。 - **Consistency(一貫性)** – データベースは有効な状態から別の有効な状態へ遷移します。 - **Isolation(分離性)** – 同時実行されるトランザクション同士が互いに干渉しません。 - **Durability(永続性)** – コミットされた変更はシステム障害後も残ります。 典型的なトランザクションの流れ: ``` BEGIN TRANSACTION -- SQL 文 COMMIT -- 失敗時は ROLLBACK ``` トランザクションにより、マルチユーザー環境でデータ整合性と予測可能な動作が保証されます。 | そっか~ニュース