質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

Q&A

解決済

2回答

1739閲覧

PostgreSQLのトランザクションの必要性について。

退会済みユーザー

退会済みユーザー

総合スコア0

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

トランザクション

トランザクションとは、関連・依存する処理を一連の不可分な処理単位として扱う処理方式を指します。トランザクションとして管理された処理は「すべて成功」か「すべて失敗」のいずれかであることが保証される。処理に失敗した場合は、一連の処理がロールバックされます。

0グッド

2クリップ

投稿2021/02/14 13:56

編集2021/02/14 15:20

この記事
https://gihyo.jp/dev/serial/01/db-academy/000102

について

"""
しかし,ログバッファ上に存在するデータが,もしディスク上のファイルへ反映される前に障害によって消えてしまった場合,そのデータは完全になくなり復旧できません。これは,ユーザが行ったはずの更新情報が消えるわけですから深刻です。

この問題は,DBMSが更新を非同期処理として行っている以上,必ず起きてしまいます。これを回避するため,DBMSはCOMMITのタイミングで必ず更新情報をログファイルへ書き込むことで,障害時のデータ整合性を担保するようにしています。逆に言うと,COMMIT時は同期処理のため,ここで遅延が発生する可能性があるのです。
"""
とありますが、PostgreSQLを使用した場合に通常はautocommitが有効になっていて自動的に文ごとにコミットされると書いてあったのですが、例えばこの機能を無効にしてCreate, Update, Deleteの処理を行う際にトランザクションを使用していなければログバッファからログファイルに更新情報が書き込まれずに、停電時などに整合性がとれなくなる可能性があるということでしょうか。もしそうであれば、この3つの操作をする際は必ずトランザクション内に入れなければならないという認識で良いのでしょうか。

あと、普通はないと思いますが

  1. トランザクション開始
  2. INSERT
  3. SELECT

...

のような場合、3番目のSELECT文は2番目のINSERTで追加した値はSELECTされる値に含まれるのでしょうか(同じテーブル)。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

autocommitが有効になっていて自動的に文ごとにコミットされると書いてあったのですが、例えばこの機能を無効にしてCreate, Update, Deleteの処理を行う際にトランザクションを使用していなければ

トランザクションを開始してCOMMITかROLLBACKで終わるというのは必ず守らなければなりません。
autocommitはこの手順を、DBMSが肩代わりするというだけですから、それを使用しないのであれば自前で実装しない限り、データは保存されません。
※尚、CreateなどのDDL文はそれまでのトランザクションを強制的にCOMMITするDBMSもあります。

また、トランザクション内で参照ではトランザクション内の変更結果を参照する事になります。
但し、ファントムリードなど、他のトランザクションの結果で影響を受けるものもあります。
これはトランザクション分離レベルによって変わります。

投稿2021/02/15 10:30

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/02/16 03:38

非常に分かりやすかったです。ありがとうございます!
guest

0

例えばこの機能を無効にしてCreate, Update, Deleteの処理を行う際にトランザクションを使用していなければ

この条件では、そもそも永続的なデータを書き込むことはできません

投稿2021/02/14 22:59

maisumakun

総合スコア145184

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問