並び順

ブックマーク数

期間指定

  • から
  • まで

1 - 40 件 / 58件

新着順 人気順

transactionの検索結果1 - 40 件 / 58件

  • TiKVにおけるトランザクションとMVCCの話

    はじめに PingCAPの小板橋です。はじめまして! TiDBの入門記事から上級者編まで幅広く取り扱う本アカウント第5回目は「TiKVにおけるトランザクションとMVCCの話」についてをまとめていきたいと思います。 TiKVの仕組み まずは、TiKVの仕組みについてを見ていきましょう。 全体のTiDBクラスターのアーキテクチャについては、下記の記事をご覧ください。 TiDBクラスターにおけるデータレイヤーにあるストレージノードとしてTiKVと呼ばれるものがあります。 TiKVは、分散型のキーバリューデータベースになり、ACIDに準拠したトランザクションAPIを提供しています。このTiKVの裏には、RocksDBとRaftコンセンサスアルゴリズムによって動作しています。 Raftコンセンサスアルゴリズムについては、また別の記事で深ぼっていきます。(こちらはこちらでお楽しみに!) RocksDB

      TiKVにおけるトランザクションとMVCCの話
    • どのレイヤー(層)でトランザクションを実装すべきか

      このように、層ごとに関心事の分離を行うことで、保守性の高い(変更容易性や再利用性等)アプリケーションを実現できます。 しかし、「トランザクション」においてはどうでしょうか。 トランザクションはビジネス領域においても、技術領域においても関心事がある内容です。 そういう曖昧なものは「ひとまず usecase 層に入れてしまえ」という方針になりがちです。 ですが、DB 固有の知識を usecase 層の関心事にしてしまっては、関心事の分離をするメリットが得られません。 そのため、関心事の分離を実現しつつトランザクション実装をする方法を模索してみました。 前提 1. クリーンアーキテクチャを採用している(オニオンアーキテクチャやレイヤードアーキテクチャも含む) そもそもビジネス知識と技術知識を分離していないアーキテクチャを採用している場合、メリットは得られません。 そのため、オニオンアーキテクチャ

        どのレイヤー(層)でトランザクションを実装すべきか
      • MySQLのREPEATABLE READとREAD COMMITTEDの違いを知るために色々試した - $shibayu36->blog;

        MySQLのトランザクション分離レベルについてふんわりとした理解しかないなと感じた。もう少し理解するために、とくにREPEATABLE READとREAD COMMITTEDの違いを手を動かして色々確認してみた。 以下の記事を参考にした。 [RDBMS][SQL]トランザクション分離レベルについて極力分かりやすく解説 #SQL - Qiita MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.7.2.1 トランザクション分離レベル 大まかな違い 公式ドキュメントを見る限り ノンリピータブルリード、ファントムリードが発生するか 範囲に含まれるギャップへのほかのセッションによる挿入をブロックするか の違いがありそうに見える。 ノンリピータブルリード、ファントムリードが発生するかを試す 以下のテーブルを作る。 CREATE TABLE `posts` ( `title`

          MySQLのREPEATABLE READとREAD COMMITTEDの違いを知るために色々試した - $shibayu36->blog;
        • モジュラモノリスにおけるトランザクション設計の考え方 / transaction design on modular monolith

          モジュラモノリスにおいてトランザクションはどうあるべきなのかについて整理している資料が少ない気付きがあったので「簡易的に」整理しました

            モジュラモノリスにおけるトランザクション設計の考え方 / transaction design on modular monolith
          • Cloud Spanner における各種トランザクションの使い分け

            Cloud Spanner における各種トランザクションの使い分け 概要 Cloud Spanner にはトランザクションの実行方法が数種類あります。これらの各方式には使うべき場所やメリット・デメリットがあるため、これらの各方式についての差分を学ぶことでより効率的に Cloud Spanner を利用できます。 Cloud Spanner で利用可能なトランザクションは分類すると以下のパターンがあります。 読み取り/書き込みトランザクション 読み取り専用トランザクション 強い整合性読み取り ステイル読み取り パーティション化 DML 特に断りがない場合、単一リージョン(リージョナル)構成での Cloud Spanner の動作を前提としています。 コードサンプルは Ruby と Ruby Spanner Client での動作を確認しています。 読み取り / 書き込みトランザクション(Re

              Cloud Spanner における各種トランザクションの使い分け
            • トランザクションを考慮した実装について考える

              はじめに アプリケーションレイヤーでトランザクションを考慮した実装をどのようにすればいいのか悩んでいる人が多いことに気がつきました。オニオンアーキテクチャ等でアプリケーションコードを関心ごとのレイヤーに分離するときに、トランザクションを開始するためのDBとのコネクションの作成をどのレイヤーで実施するのか悩んでいる人が多いそうです。 本記事ではDDD+オニオンアーキテクチャ+Repositoryパターンを使う前提で、私がよく使うトランザクションを考慮した実装について説明しようと思います。 トランザクションを考慮した実装 私はトランザクションを開始するためのDBとのコネクションの作成はUsecase層で実施します。 私がよく書く実装ではDDDでいうEntityを定義します。そしてRepositoryではEntityのCRUDのみ行うように実装し、Repositoryをトランザクション境界にしま

                トランザクションを考慮した実装について考える
              • 【戦術的DDD】なぜトランザクションをユースケース層で張るのか - Yappli Tech Blog

                概要 こんにちは。サーバーサイドエンジニアの窪田です。 これまでの戦術的DDDについて以下のような記事で紹介してきました。 戦術的DDDをGoで実現する【entity編】 - Yappli Tech Blog 戦術的DDDをGoで実現する【Value Object編】 - Yappli Tech Blog Deep Moduleという観点から戦術的DDDのRepositoryの設計を考えてみた - Yappli Tech Blog 今回は戦術的DDDにおけるトランザクションの扱いについて注目します。 トランザクションは一見インフラ層の関心ごとなのでインフラ層で完結するように思えますが、DDDの本にある例では、ユースケース層で張っているソースコードの例が紹介されています。 なぜ、そのような設計になるのかを考えていきます。 DDDとトランザクションの関係 DDDとトランザクションは実は深い関係

                  【戦術的DDD】なぜトランザクションをユースケース層で張るのか - Yappli Tech Blog
                • Pitfalls of Rails db transactions

                  Rollback Rails transaction and rescue error to display it good: This is fine record = MyModel.last error_for_user = nil begin ActiveRecord::Base.transaction do # ... record.save! end rescue ActiveRecord::RecordInvalid => e # do something with exception here error_for_user = "Sorry your transaction failed. Reason: #{e}" end puts error_for_user || "Success" source, source2, source3 This is ok as wel

                  • DB外の副作用をトランザクションから分離しよう / Isolate out-of-DB side effects from transactions

                    gotanda.rb#52@オンライン "DB外の副作用をトランザクションから分離しよう"

                      DB外の副作用をトランザクションから分離しよう / Isolate out-of-DB side effects from transactions
                    • リレーショナルデータベースシステムを趣味で開発している者です。 現在、開発中のシステムを並行トランザクションへ対応させることを検討しており、どのような手法があるのか調べたところ、SS2PLもしくはS2PLという手法が私と同じように自作をされている方々の中では多く採用されているようだと分かりました。 一方で、PostgreSQLやMySQLなどのプロダクションレベルで利用されているシステムではMVCCと呼ばれる手法が採用されているということも分かりました。 きっと後者の方が多くの場合で高いスループットが得ら

                      リレーショナルデータベースシステムを趣味で開発している者です。 現在、開発中のシステムを並行トランザクションへ対応させることを検討しており、どのような手法があるのか調べたところ、SS2PLもしくはS2PLという手法が私と同じように自作をされている方々の中では多く採用されているようだと分かりました。 一方で、PostgreSQLやMySQLなどのプロダクションレベルで利用されているシステムではMVCCと呼ばれる手法が採用されているということも分かりました。 きっと後者の方が多くの場合で高いスループットが得られるということなのだと思うので、可能であればMVCCを採用したいのですが、あまり初学者向けの実装例も見当たらず、どうしたものかと悩んでおります。 SS2PL/S2PLとMVCCの実装の難易度・工数はどの程度違うものなのでしょうか? また、初めてリレーショナルデータベースシステムを開発する者

                        リレーショナルデータベースシステムを趣味で開発している者です。 現在、開発中のシステムを並行トランザクションへ対応させることを検討しており、どのような手法があるのか調べたところ、SS2PLもしくはS2PLという手法が私と同じように自作をされている方々の中では多く採用されているようだと分かりました。 一方で、PostgreSQLやMySQLなどのプロダクションレベルで利用されているシステムではMVCCと呼ばれる手法が採用されているということも分かりました。 きっと後者の方が多くの場合で高いスループットが得ら
                      • マイクロサービスとトランザクション - Qiita

                        AWS for Games Advent Calendar 2022 9日目の記事です。 Game Server Services(GS2) ではゲームに必要となるサーバー機能をマイクロサービス化し、皆さんに提供しています。 マイクロサービスには所持品の管理や、ゲーム内ストア、課金通貨の残高管理など30を超える機能を用意しており、これらを組み合わせながらゲーム内の仕様を実現できるようにしています。 さて、マイクロサービスの最も難しい課題はトランザクションにあると私は考えています。 今回は Game Server Services がどのようにこの課題に立ち向かい、そして問題を解決しているかお話ししたいと思います。 マイクロサービスとトランザクションの両立がなぜ難しいのか モノリシックなサーバーシステムは、大体の場合「所持品の所持数量」と「課金通貨の残高」は同じRDBに保存しています。 そし

                          マイクロサービスとトランザクション - Qiita
                        • アプリケーション・モダナイゼーション: マイクロサービス間のデータ同期 - 赤帽エンジニアブログ

                          レッドハットのソリューションアーキテクトの森です。 マイクロサービスについて、前回はそのアーキテクチャの概要から利点、そして課題についてまとめました。今回はマイクロサービス間のデータ同期の手法についてご紹介していきます。 前回の記事はこちらです。 rheb.hatenablog.com Outboxパターン と Change Data Capture によるデータ同期 マイクロサービスにおいては、基本的には各サービスとデータベースは1:1とするモデルを推奨しています。そのため、サービス間のデータベースの同期を取るしくみについて考慮が必要です。データベース間の同期を取るための方法の1つとして、データベース処理とメッセージを併用する Transactional Outbox と Transactionlog tailing があります。 Transactional Outbox の実体はデータ

                            アプリケーション・モダナイゼーション: マイクロサービス間のデータ同期 - 赤帽エンジニアブログ
                          • MySQL/Postgres におけるトランザクション分離レベル

                            MySQL/Postgres におけるトランザクション分離レベルと発生するアノマリーを整理する https://zenn.dev/mpyw/articles/rdb-transaction-isolations 上記のスライドの具体的な結論に至るまでの導入として,知識があまりない状態でも段階的に読み込んでいけるように心がけたスライドで,株式会社ゆめみの社内勉強会にて発表しました。 スライドの途中の URL などは PDF としてダウンロードするとクリックできると思います。 事前のレビュー協力者 - https://twitter.com/neko_han25 - https://twitter.com/KentarouTakeda

                              MySQL/Postgres におけるトランザクション分離レベル
                            • MySQL/Postgres におけるトランザクション分離レベルと発生するアノマリーを整理する

                              読者対象 ANSI 定義の古典的なトランザクション分離レベルとアノマリーは概ね理解している MySQL/Postgres では理論的な部分がどうなっているのかを知りたい 理論面の前提知識 2022-08-19 追記: 社内勉強会向けのスライドを作成しました。先にスライドを見てから,引用文献およびこの記事を読むと理解が深まると思います。 まず ANSI 定義の古典的な定義を聞いたことが無い方は,以下のリンクを参照されたい。 ANSI 定義に対応する解説はこれらのサイト以外にもたくさんあるため,自分にとって読みやすいと感じる情報をあたってほしい。(既に熟知されている方は十分) 次点で読んでいただきたいのが, @kumagi さんの以下の記事。古典的には 4 つの分離レベルと 3 つのアノマリーだけで説明されていたものの,不十分であることが学術的に指摘され,解像度を上げようとする流れが後になって

                                MySQL/Postgres におけるトランザクション分離レベルと発生するアノマリーを整理する
                              • SQLiteのDatabase is lockedで悩む人に見て欲しいロックの話

                                SQLiteを使ったサイトをいくつか運営しているのですが、時折発生する↓このエラーに頭を悩ませていました。 SQLSTATE[HY000]: General error: 5 database is locked 急いでいる方のために先に答えを書いておきますが、このエラーはSQLiteのトランザクションの挙動を理解していないために発生しているエラーであり、BEGIN IMMEDIATEを適切に使うことで解決しました。 何も考えず、pdoのbeginTransactions()を使ったり、単に BEGIN だけで開始したり…。 PDOの接続オプションで PDO::ATTR_TIMEOUT に20を設定しておけば書き込みが衝突しても20秒待ってくれるだろ、と思い込んだり…。MySQLやPostgreSQL、SQLSeverやOracleなどの商用データベースに慣れている方ほどこの Databa

                                  SQLiteのDatabase is lockedで悩む人に見て欲しいロックの話
                                • PostgreSQLのrow-level lockの動きについて - Qiita

                                  この記事では、前回の記事PostgreSQLのrow-level lockの概要に引き続き、動きがわかりづらいPostgreSQLのrow-level lockについての解説を行います。 大まかな概要を掴むための記事なのですべての動作を網羅しているわけではないですし、一部解説に誤りが含まれていたり、正確ではない可能性があるのでご注意ください。 なお、クエリの実行例などはすべてPostgreSQL 13上での動作結果となります。 また、次の二つの拡張機能を利用しています。 https://www.postgresql.org/docs/current/pgrowlocks.html https://www.postgresql.org/docs/current/pageinspect.html ロックに利用される領域について row-level lockはタプルヘッダのt_infomask,

                                    PostgreSQLのrow-level lockの動きについて - Qiita
                                  • MySQLで発生し得る思わぬデッドロックと対応方法

                                    はじめに この記事は実際の業務で発生した MySQL のデッドロックとそのいくつかの回避方法や対応方法を(テーマは変えて)手元で実行できるコードを用いて解説する記事です。具体的には「トランザクション張っておけば大丈夫」と思ってませんか? バグの温床になる、よくある実装パターンの記事で紹介されている「1on1 チャットサービス」で紹介されているデッドロックとデータベースレイヤでは同じ状況だったのですが、記事で紹介されている方法とは別の方法でデッドロックを回避する必要があったため、同じ状況に遭遇した人の助けになればという思いで記事を書きました。また、こちらの記事が無ければ私自身も現象を理解するのにもっと苦労したと思うので、この場を借りてお礼申し上げます! 出金サービス履歴登録サービスを例に考える コードと説明が https://github.com/shuntagami/withdrawal_

                                      MySQLで発生し得る思わぬデッドロックと対応方法
                                    • WHERE 条件のフィールドを UPDATE するのって,明示的にロックしてなくても安全?全パターン調べてみました! - Qiita

                                      WHERE 条件のフィールドを UPDATE するのって,明示的にロックしてなくても安全?全パターン調べてみました!MySQLSQLPostgreSQLDatabaseQiitaEngineerFesta2022 TL; DR MySQL/Postgres とも, MVCC アーキテクチャの恩恵で, SELECT と UPDATE は基本的には競合しない。 単一レコードのシンプルな UPDATE でも排他ロックされ,排他ロック中のレコードへの UPDATE での変更操作は トランザクション分離レベルによらず ブロックされる。UPDATE 文に含まれる WHERE 句での検索もブロックされ,これはブロックされない SELECT による検索とは別扱いになる。 但し UPDATE 文の WHERE 句上で,更新対象をサブクエリの SELECT から自己参照している場合は例外。トランザクション分離

                                        WHERE 条件のフィールドを UPDATE するのって,明示的にロックしてなくても安全?全パターン調べてみました! - Qiita
                                      • Distributed transaction patterns for microservices compared | Red Hat Developer

                                        As a consulting architect at Red Hat, I've had the privilege of working on legions of customer projects. Every customer brings their own challenges but I've found some commonalities. One thing most customers want to know is how to coordinate writes to more than one system of record. Answering this question typically involves a long explanation of dual writes, distributed transactions, modern alter

                                          Distributed transaction patterns for microservices compared | Red Hat Developer
                                        • データ変更を伴うバッチ処理を書く時に考慮していること - shallowな暮らし

                                          こんにちは、id:shallow1729です。最近はインフラ寄りなお仕事をよくやっていますがこれまでにいくつかデータ移行やデータ基盤構築などのバッチ処理のお仕事をしてきました。以前にも一度そういった経験を元に記事を書いたのですが、MySQLやシステムに関する知識が以前よりも増えた今もう一度書き直したいなと思いました。 なので今回はバッチ処理を書く時のテクニック2022版という感じです。今の仕事の関係でMySQLやrailsを前提にしている話が多いですが、おそらく他のデータベースを使っている人にも役に立つ話が多いのではないかと思います。ただ、今回の記事は経験に基づくものが多く、あまりよくないアイデアもあるかもしれません。改善点や間違いなどあればご指摘ください。 冪等性を持つように 冪等性とは端的に言えばある操作を複数回実行しても一回しか実行しなかった時と同じ結果になる性質の事です。長時間かか

                                            データ変更を伴うバッチ処理を書く時に考慮していること - shallowな暮らし
                                          • マルチスレッドレプリカにおける運用時の注意点について

                                            はじめに 2021 年 10 月 19 日に MySQL 8.0.27 がリリース されました。非同期レプリケーションにおける変更点の 1 つとして、デフォルトでマルチスレッドレプリカが有効になり、レプリカの遅延を軽減しやすくなることが期待できるようになりました。 Replication: Multithreading is now enabled by default for replica servers. A multithreaded applier has a number of applier threads that execute transactions in parallel. This behavior can avoid many cases of unwanted replication lag that can cause temporary divergenc

                                              マルチスレッドレプリカにおける運用時の注意点について
                                            • 本当にtransactionは必要なのか? - 急がば回れ、選ぶなら近道

                                              前提 前提ですが。 transaction=Consistency/Isolationを担保する仕組みの話とする。 一般にtransactionが持つべき属性はACIDと言われる。C/Iに比べて、A/Dが“わかりやすい”のでAtomic/Durableの属性の方が人口に膾炙しているが、現在のtransactionではA/Dネタはあまり話題にならない。A/Dネタはローカルだけで見るのであれば普通にfile system /storageの話になる。元来Atomic/Durableはtransactionのコンテクストでは専らlogging / recoveryの話だった。そして、これは非同期のepoch-basedになるとそれ自体の取り扱い優先度が下がる。現代的なtransactionでは、「現時点ではread committedが保証されているFS/storageでA/Dの問題は(ある程度

                                                本当にtransactionは必要なのか? - 急がば回れ、選ぶなら近道
                                              • Cloud SpannerとCloud Pub/Subとで実装するTransactional outboxパターン | メルカリエンジニアリング

                                                Credit Designチームでバックエンドエンジニアをしている@iwataです。主にメルペイスマート払い関連の開発をしています。 Merpay Advent Calendar 2021 の21日目の記事をお届けします。 メルペイスマート払いの開発においてもご多分に漏れず、マイクロサービスアーキテクチャを採用しています。マイクロサービス開発において避けては通れない問題として、分散トランザクションによるデータ整合性の担保があります。メルペイスマート払いマイクロサービスでは一部APIにおいて整合性担保のために、Transactional outboxパターンを用いた実装をしています。 本記事ではテーブル設計を含めたその実装の詳細を紹介したいと思います。 tl;dr Transactional outboxパターンを使ったSpanner, Pub/Sub間での整合性担保 Spannerならでは

                                                  Cloud SpannerとCloud Pub/Subとで実装するTransactional outboxパターン | メルカリエンジニアリング
                                                • バッチ処理 プラクティス

                                                  バッチ処理は既に先人の方々が多くのナレッジを公開してくれていますが、それでもなお難しさが変わらないテーマだと思っています。 この記事は、筆者がこれまでの開発経験で気づいたバッチ処理の実装ナレッジを整理し、体系化を目指して文章にしました。 ここでの内容が、より良い課題解決に貢献できれば幸いです。 自身の断片的な思考整理(メモ書き)の延長で内容を整理したため、一部書き振りが統一されておらず、読みにくいかもしれません。ご了承ください。🙏 バッチ処理の難しさバッチ処理は難しい。 人によっては簡単なテーマかもしれませんが、自分は難しいテーマだと思っています。 「難しさの根源は何か?」を考えると、1. 考慮点が多様にあること 2. 解決する課題によって答えが大きく変わること に整理できました。 この2点は、どのソフトウェア開発にも当てはまる項目ではありますが、ことバッチ処理においては顕著に現れます。

                                                    バッチ処理 プラクティス
                                                  • マイクロサービスにひそむ複雑さに立ち向かう - Qiita

                                                    はじめに はじめまして。Kyashでサーバサイドエンジニアを担当しているhirobeです。 Kyash Advent Calendar 2021の12/5担当分です。 Kyashでは、約30ほどのマイクロサービスが動いてます。 マイクロサービスは難しいです。 私が入社して2年半ほどの間、マイクロサービスの複雑さに苦しめられ、あがいてきた実経験をもとに、マイクロサービスにひそむ難しさを紹介したいと思います。 ここでは、ケースとして、弊社の機能のひとつである登録カードからのリンクを実装する上で発生する問題を紹介したいと思います。もちろん弊社サービスを使ったことない人でもわかるように説明をしますのでご安心ください。 なお、最初に注意書きしておくと、本ブログではあくまで「マイクロサービスにひそむ複雑さとその対応法」を説明するためのわかりやすさを優先して説明していきます。事実とは異なるケースがありま

                                                      マイクロサービスにひそむ複雑さに立ち向かう - Qiita
                                                    • 【書き起こし】Payment distributed transaction case study – Rui Gao【Merpay Tech Fest 2021】 | メルカリエンジニアリング

                                                      【書き起こし】Payment distributed transaction case study – Rui Gao【Merpay Tech Fest 2021】 Merpay Tech Fest 2021は、事業との関わりから技術への興味を深め、プロダクトやサービスを支えるエンジニアリングを知れるお祭りで、2021年7月26日(月)からの5日間、開催しました。セッションでは、事業を支える組織・技術・課題などへの試行錯誤やアプローチを紹介していきました。 この記事は、「Payment distributed(分散)transaction case study」の書き起こしです。 Rui Gao氏:皆さん、こんにちは。本日は「Payment distributed(分散)transaction case study」というテーマで発表させていただきます。 まず、簡単に自己紹介させてください

                                                        【書き起こし】Payment distributed transaction case study – Rui Gao【Merpay Tech Fest 2021】 | メルカリエンジニアリング
                                                      • 【連載 第1回】freeeカード Unlimited の開発の道のり - freee Developers Hub

                                                        金融チームでエンジニアをしているimamuraです。freeeカード Unlimited のβ版の提供が今年(2021年)の秋から開始されます。開発自体は半年以上かかっており、そこでの開発の裏側について連載を行います! 連載は以下のようになります。 ※ 日程、タイトルは一部変更になる可能性があります 日程 タイトル 執筆者 9/9 freeeカード Unlimited の開発の道のり imamura 9/16 freeeカード Unlimited での非同期通信の設計と実装 imamura 9/23 EMから再度エンジニアに戻り新規プロダクト開発に挑戦して学んだこと tabachain 9/30 freeeカード Unlimitedでのクリーンアーキテクチャ実践 id:lvmingbei 10/7 新卒一年目からの新規プロダクト開発 sekky 10/14 新規プロダクト&新造チーム&フル

                                                          【連載 第1回】freeeカード Unlimited の開発の道のり - freee Developers Hub
                                                        • 決済システムの残高管理周りの DB 設計と戦略 - カンムテックブログ

                                                          エンジニアの佐野です。今日はカンムの決済システムでユーザの残高管理をどうやっているかについて書きます。 カンムの製品であるバンドルカードはプリペイド方式のカードです。ユーザによる入金、店舗での利用、運営事由の操作などによりユーザの残高が増減します。このような残高の管理について単純に考えると user_id と balance と updated_at あたりをもったテーブルを用意して balance と updated_at を更新していく方法があるかもしれません。しかしながらカンムでは残高を管理するテーブルを持たず、これらイベントの履歴のみで残高を管理しています。以下、本記事ではこれらユーザの残高が増減するイベントのことをトランザクションと呼びます。ここでは DB の Transaction Processing を意味しません。 本記事のポイントは 残高を管理をするテーブルは作らず、ト

                                                            決済システムの残高管理周りの DB 設計と戦略 - カンムテックブログ
                                                          • Cloud Native時代のデータベース

                                                            2021/6/11 #InfraStudy 2nd Season

                                                              Cloud Native時代のデータベース
                                                            • MVCCとInnoDBでの実装について - shallowな暮らし

                                                              こんにちは。id:shallow1729です。先日はredo logを中心にストレージエンジンについて解説を行いましたが、今回は同時実行制御、特にMySQLなど多くのデータベースで採用されているMultiversion Concurrency Control(MVCC)という技術にフォーカスしようと思います。 今回の記事ではまず前半でMVCCというものがどういうものかについて解説をして、次にMVCCの実装方法についてInnoDBの実装を参考にしながら見ていこうと思います。前提知識はあまりいらないと思いますが、リレーショナルデータベースの操作経験はあったほうがいいかなと思います。また、前回のストレージエンジンの解説で述べた内容はあまり説明しないので、軽く目を通してもらえると頭に入りやすいかなと思います。 shallow1729.hatenablog.com トランザクションの原子性 まずトラ

                                                                MVCCとInnoDBでの実装について - shallowな暮らし
                                                              • SQL Serverのスナップショット分離レベル導入によるデータ基盤連携の課題解決 - ZOZO TECH BLOG

                                                                こんにちは。アーキテクト部の廣瀬です。 弊社ではサービスの一部にSQL Serverを使用しており、BigQuery上のデータ基盤へテーブルを連携しています。連携の仕組みは非常によくできているものの、データ不整合や遅延が発生し得るという課題を抱えていました。しかし、SQL Serverのスナップショット分離レベルを導入することでそれらを解決できました。本記事では、抱えていた課題および解決までの流れと、スナップショット分離レベルを導入する際に気を付ける点を紹介します。 データ基盤連携の方法と課題 データ基盤との連携方法は、日次連携とリアルタイム連携の2種類です。それぞれの連携方法と抱えていた課題について説明します。 日次連携 1日1回、SQL Server専用の一括コピーツールである「bcp」を使用してテーブル全体のデータを取得する連携方法です。データ取得時のSQLのイメージは以下の通りです

                                                                  SQL Serverのスナップショット分離レベル導入によるデータ基盤連携の課題解決 - ZOZO TECH BLOG
                                                                • CockroachDB から覗く形式手法の世界 #JTF2021w / July Tech Festa 2021 winter

                                                                  July Tech Festa 2021 winter で使用したスライドです。 バグのない分散システムの設計は果たして可能でしょうか? この問いに対する一つの答えとして、CockroachDB では形式手法ツール TLA+ を用いて分散トランザクションの正しさを担保しています。 形式手法はシステムの挙動を数学的に解析する技法で、「ノードが特定のタイミングで故障した場合にのみ発生するバグ」といった再現困難な問題を確実に検出することができます。 本講演では、CockroachDB の事例を通して、形式手法が実世界で活用されている様子をお伝えします。 イベント概要:https://techfesta.connpass.com/event/193966/ ブログ記事:https://ccvanishing.hateblo.jp/entry/2021/01/24/185819 録画:https:/

                                                                    CockroachDB から覗く形式手法の世界 #JTF2021w / July Tech Festa 2021 winter
                                                                  • Firestore (in Datastore mode) のトランザクションの挙動を試してみる - Qiita

                                                                    (本記事は今年の夏頃に某勉強会で発表した内容の焼き直しです。参加者の方が読むとかなりの部分重複があると思いますがご容赦下さい🙇‍♂️) はじめに 旧Cloud Datastore(以降、旧Datastoreと記します)を長く使ってきましたが、そろそろFirestore in Datastore mode(以降Firestoreと記します)に真面目に取り組もうと重い腰を上げることにしました。 Firestoreの仕様はDatastoreとほぼ変わらないですが、主にトランザクション周りに大きな変更があります。 本記事ではFirestoreのトランザクションの挙動を実際にプログラムを動かしていろいろ検証してみます。 なお、本記事ではnative modeについては扱いません。 ただ、おそらくトランザクション周りの挙動はほぼ共通なのではと思っている(違っていたらごめんなさい)ので、参考にはなるか

                                                                      Firestore (in Datastore mode) のトランザクションの挙動を試してみる - Qiita
                                                                    • 「トランザクション張っておけば大丈夫」と思ってませんか? バグの温床になる、よくある実装パターン

                                                                      この記事は DeNA 20 新卒 Advent Calendar 2020 19日目の記事です。 はじめに MySQLやPostgreSQLに代表されるRDBMSではトランザクションと呼ばれる仕組みが提供されています。多くのWebアプリケーションエンジニアはこのトランザクションを駆使してDBとやりとりをするロジックを組み立てることになります。 しかし不整合を起こしたくない処理があるからといって闇雲にトランザクションを張ったり、トランザクションが張られているからと安心してアプリケーション側で闇雲にロジックを組み立ててしまうと思わぬバグを生むことになってしまいます。 このエントリでは、「トランザクションを張っておけば大丈夫」という考え方は危険な場合もあるということを、ありがちな実装例を交えて紹介していきます。 並列に処理されるトランザクション そもそも、トランザクションは全て直列に処理されるわ

                                                                        「トランザクション張っておけば大丈夫」と思ってませんか? バグの温床になる、よくある実装パターン
                                                                      • SELECT ... FOR UPDATE同士でデッドロックさせる - かみぽわーる

                                                                        最近SELECT ... FOR UPDATEでデッドロックする話を何度かしたので。 前職のときにUPDATE同士がデッドロックしてたときに、SELECT ... FOR UPDATEで排他ロックを取ってからUPDATEしてデッドロックを防ぎますってPRをレビューしてたときのことで、複数レコードの排他ロックは一瞬ですべてのレコードのロックを取れるわけではなく、ロックを取る順番が揃っていないと簡単にデッドロックしますよという話です。 https://gist.github.com/kamipo/0bb4e37d58ba18a8cefb8aa02f778231 # frozen_string_literal: true require "mysql2" def client Mysql2::Client.new( host: "localhost", username: "root", dat

                                                                          SELECT ... FOR UPDATE同士でデッドロックさせる - かみぽわーる
                                                                        • Rails APIドキュメント: Active Recordのトランザクション(翻訳)|TechRacho by BPS株式会社

                                                                          概要 MITライセンスに基づいて翻訳・公開いたします。 英語ドキュメント: ActiveRecord::Transactions::ClassMethods(18707ab) ライセンス: MIT 2020/11/30: 初版公開(77f7b2d) 2022/12/07: 更新 トランザクションとは、それが1件のアトミックな操作としてすべて成功した場合に限りSQLステートメントが永続化する、保護的なブロックです。古典的な例としては「出金が成功した場合にのみ入金ができる(またはその逆の)2つの口座間での振替」があります。トランザクションはデータベースの一貫性を強制し、プログラムのエラーやデータベースの破損からデータを保護します。つまり、「すべて一括実行される」か「一切実行されない」かのどちらかでなければならないステートメントが複数ある場合は、基本的にトランザクションブロックを使うべきです。

                                                                            Rails APIドキュメント: Active Recordのトランザクション(翻訳)|TechRacho by BPS株式会社
                                                                          • On the Performance of User-Mode Threads and Coroutines – Inside.java

                                                                            Discussions of coroutines and user-mode threads — like Project Loom’s virtual threads or Go’s goroutines — frequently turn to the subject of performance. The question I’ll try answering here is, how do user-mode threads offer better application performance than OS threads? One common assumption is that this has to do with task-switching costs, and that the performance benefit of user-mode threads

                                                                              On the Performance of User-Mode Threads and Coroutines – Inside.java
                                                                            • MySQLを止めずにレプリケーションをブーストする小技 - mita2 database life

                                                                              先日は、MySQLユーザ会会 2020年7月に参加しました。 今回はWebや雑誌で連載の著者の方々が、執筆に至った経緯や、執筆時に心がけていることを語る回でした。 @kk2170 さんが「過去の自分に向けて書く」とおっしゃっていたのが、(そういう視点は自分の中になかったので)すごく響きました。 mysql.connpass.com -- 一刻も早くレプリケーション遅延を取り戻したい!そんな場合に使える小技を紹介します。 レプリケーションを止めずに有効化・無効化できるのみを取り上げています。 元に戻すのにレプリケーションを止める必要性のある方法だと、またそこでレプリケーション遅延が発生しますからね… CPU の governor を performance に変更する LinuxにはCPUクロックの調整機能があり、CPU governor が ondemand 設定の場合、負荷に応じて、CP

                                                                                MySQLを止めずにレプリケーションをブーストする小技 - mita2 database life
                                                                              • トランザクション中の文の失敗の扱いの違い - Write and Run

                                                                                (読みづらいタイトルだな) ことの発端はこのツイート。 MySQLは、以下を満たさないという理解でいいのか? エラーが出た時にPostgreSQLのようにロールバックを行わないので Atomicity(原子性)・・・トランザクションの実行結果は「全て成功」か「全て失敗」のいずれかでなければならない#mysql— imaharu (@imaharuTech) July 2, 2020 さすがの MySQL でもそこを破ってくることはないだろうと思いつつ、トランザクション野郎としてはちゃんと確かめねばならないと思い、早朝にも関わらず布団から出てラップトップを開いた(午前10時)。 実験1 以下のような docker-compose.yml と sql/script.sql を用意し、実験をする。 version: '3.3' services: db: image: mysql:8 envir

                                                                                  トランザクション中の文の失敗の扱いの違い - Write and Run
                                                                                • 外部キー制約は何も考えずに適用するとよくない - かとじゅんの技術日誌

                                                                                  このブログが話題になってますね。制約を付けること自体はよいことだけど、無目的に適用すると害も生じると思います。 無目的という言い方はおかしいな…。外部キー制約をどのように使えばいいのか、逆にどんなときに使うとまずいのかを考えてみたいと思います。 tech.tabechoku.com 例えば、これ。外部キー制約はできるだけ付けるとか、何も考えずに付けるとよくないと思います。 外部キー制約は、可能な限りつけるようにしています。 DBが別れている場合、外部キーはもちろん貼れないのですが、そうでない場合はとにかく何も考えず貼っています。データベース設計の際に気をつけていること - 食べチョク開発者ブログ テーブル設計をシミュレーションする いいたいことの結論はこれ。以上終了なのですが、もう少しわかりやすく書いてみよう。 何も考えずに外部キーを貼るのは良くないな。トランザクション境界の外で結果整合性

                                                                                    外部キー制約は何も考えずに適用するとよくない - かとじゅんの技術日誌