<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      Node生態中最優雅的數據庫事務處理機制

      Vona ORM 對數據庫事務提供了完整的支持,提供了直觀、優雅、強大的特性:

      1. 使用裝飾器啟用事務
      2. 事務傳播機制
      3. 事務補償機制
      4. 確保數據庫與緩存數據一致性

      使用裝飾器啟用事務

      import { Database } from 'vona-module-a-orm';
      
      class ServicePost {
        @Database.transaction()
        async transaction() {
          // insert
          const post = await this.scope.model.post.insert({
            title: 'Post001',
          });
          // update
          await this.scope.model.post.update({
            id: post.id,
            title: 'Post001-Update',
          });
        }
      }  
      

      手工啟用事務

      1. 使用當前數據源

      class ServicePost {
        async transactionManually() {
          const db = this.bean.database.current;
          await db.transaction.begin(async () => {
            await this.scope.model.post.update({ id: 1, title: 'Post001_Update' });
          });
        }
      }
      

      2. 使用指定數據源

      class ServicePost {
        async transactionManually() {
          const db = this.bean.database.getDb({ clientName: 'default' });
          await db.transaction.begin(async () => {
            const modelPost = this.scope.model.post.newInstance(db);
            await modelPost.update({ id: 1, title: 'Post001_Update' });
          });
        }
      }
      

      事務參數

      class ServicePost {
        @Database.transaction({
      +   isolationLevel: 'READ_COMMITTED',
      +   propagation: 'REQUIRED'
        })
        async transaction() {
          ...
        }
      }  
      
      class ServicePost {
        async transactionManually() {
          const db = this.bean.database.getDb({ clientName: 'default' });
          await db.transaction.begin(
            async () => {
              ...
            },
            {
      +       isolationLevel: 'READ_COMMITTED',
      +       propagation: 'REQUIRED',
            }
          );
        }
      }  
      

      事務參數:isolationLevel

      名稱 說明
      DEFAULT 數據庫相關的缺省isolationLevel
      READ_UNCOMMITTED
      READ_COMMITTED
      REPEATABLE_READ
      SERIALIZABLE
      SNAPSHOT

      事務參數:propagation

      Vona ORM 支持數據庫事務傳播機制

      名稱 說明
      REQUIRED 默認的事務傳播級別。如果當前存在事務, 則加入該事務。如果當前沒有事務, 則創建一個新的事務
      SUPPORTS 如果當前存在事務,則加入該事務. 如果當前沒有事務, 則以非事務的方式繼續運行
      MANDATORY 強制性。如果當前存在事務, 則加入該事務。如果當前沒有事務,則拋出異常
      REQUIRES_NEW 創建一個新的事務。如果當前存在事務, 則把當前事務掛起。也就是說不管外部方法是否開啟事務,總是開啟新的事務, 且開啟的事務相互獨立, 互不干擾
      NOT_SUPPORTED 以非事務方式運行。如果當前存在事務,則把當前事務掛起(不用)
      NEVER 以非事務方式運行。如果當前存在事務,則拋出異常

      事務補償機制

      當事務成功或者失敗時執行一些邏輯

      1. 成功補償

      this.bean.database.current.commit(async () => {
        // do something when success
      });
      

      2. 失敗補償

      this.bean.database.current.compensate(async () => {
        // do something when failed
      });
      

      事務與Cache數據一致性

      許多框架使用最簡短的用例來證明是否高性能,而忽略了業務復雜性帶來的性能挑戰。隨著業務的增長和變更,項目性能就會斷崖式下降,各種優化補救方案讓項目代碼繁雜冗長。而 Vona 正視大型業務的復雜性,從框架核心引入緩存策略,并實現了二級緩存Query緩存Entity緩存等機制,輕松應對大型業務系統的開發,可以始終保持代碼的優雅和直觀

      Vona 系統對數據庫事務與緩存進行了適配,當數據庫事務失敗時會自動執行緩存的補償操作,從而讓數據庫數據與緩存數據始終保持一致

      針對這個場景,Vona 提供了內置的解決方案

      1. 使用當前數據源

      class ServicePost {
        @Database.transaction()
        async transaction() {
          // insert
          const post = await this.scope.model.post.insert({
            title: 'Post001',
          });
          // cache
          await this.scope.cacheRedis.post.set(post, post.id);
        }
      }  
      
      • 當新建數據后,將數據放入 redis 緩存中。如果這個事務出現異常,就會進行數據回滾,同時緩存數據也會回滾,從而讓數據庫數據與緩存數據保持一致

      2. 使用指定數據源

      class ServicePost {
        async transactionManually() {
          const db = this.bean.database.getDb({ clientName: 'default' });
          await db.transaction.begin(async () => {
            const modelPost = this.scope.model.post.newInstance(db);
            const post = await modelPost.insert({ title: 'Post001' });
            await this.scope.cacheRedis.post.set(post, post.id, { db });
          });
        }
      }  
      
      • 如果對指定的數據庫進行操作,那么就需要將數據庫對象db傳入緩存,從而讓緩存針對數據庫對象db執行相應的補償操作。當數據庫事務回滾時,讓數據庫數據與緩存數據保持一致
      posted @ 2025-09-30 10:08  濮水大叔  閱讀(168)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 成人特黄特色毛片免费看| 人人人澡人人肉久久精品| 亚洲一区二区约美女探花| 国产精品高清中文字幕| 无遮挡aaaaa大片免费看| 亚洲av无码专区在线亚| 国产精品无遮挡在线观看| 女人扒开的小泬高潮喷小| 丁香五月婷激情综合第九色| 久久中文字幕无码一区二区| 久久精品国产福利一区二区| 8x国产精品视频| 伊人久久大香线蕉综合观| 久久道精品一区二区三区| 色二av手机版在线| 色噜噜狠狠成人综合| 自拍视频亚洲精品在线| 亚洲最大有声小说AV网| 人妻中文字幕亚洲一区| 高潮喷水抽搐无码免费| 亚洲国产成人久久精品app| 日本高清视频网站www| 亚洲中文字幕伊人久久无码| 秋霞鲁丝片成人无码| 光山县| 在线观看特色大片免费网站| 狠狠躁夜夜躁人人爽天天5| 7m精品福利视频导航| 天堂网av最新版在线看| 亚洲成人av综合一区| 99精品国产一区二区三区2021| 久久夜色精品国产噜噜亚洲sv| 在线中文字幕国产精品| 免费国产女王调教在线视频| 国产麻豆一区二区精彩视频| 亚洲一区二区精品偷拍| 亚洲日韩精品一区二区三区| 亚洲一区二区三区激情在线| 免费无码黄网站在线观看| 虹口区| 国产精品∧v在线观看|