NewLife.XCode是一個有10多年歷史的開源數據中間件,支持nfx/netstandard,由新生命團隊(2002~2019)開發完成並維護至今,以下簡稱XCode。
整個系列教程會大量結合示例代碼和運行日志來進行深入分析,蘊含多年開發經驗於其中,代表作有百億級大數據實時計算項目。
開源地址:https://github.com/NewLifeX/X (求star, 743+)
為什么需要事務
事務,通俗來講,同時干幾件事,要么一起成功,要么一起失敗!
一個比較古老的事務處理案例,(在2002年前后比較常見),就是轉賬:
- A給B轉賬100元,先在A賬戶減100元,然后在B賬號加100元,如果A減成功而B加失敗,那么就會數據不一致
- A給B轉賬100元,先在B賬戶加100元,然后在A賬號減100元,如果B加成功而A減失敗,同樣有問題
此時,需要一個事務把兩個操作包含起來,偽代碼如下:
begin; A-=10; B+=10; commit; exception rollback; end
這里用白話解釋了為什么需要事務,至於事務的原理,絕大部分開發者用不到,感興趣者可以自行搜索學習。
事務用法
1,最老的用法。從實體類元數據開始
UserX.Meta.BeginTrans(); try { //todo UserX.Meta.Commit(); } catch { UserX.Meta.Rollback(); throw; }
2,基於連接的用法。實體類事務實質上是在連接上開事務,因此同一個連接的多個實體類,不管用哪一個開事務效果都是一樣的
var dal = UserX.Meta.Session.Dal; dal.BeginTransaction(); try { //todo dal.Commit(); } catch { dal.Rollback(); throw; }
3,最先進的用法。未提交而離開作用域時執行回滾,還支持多個不同數據庫同時打開事務
using (var tran1 = UserX.Meta.CreateTrans()) using (var tran2 = Role.Meta.CreateTrans()) { //todo tran1.Commit(); tran2.Commit(); }
在業務代碼里面,如果有問題直接拋出異常或者return跳出作用域即可
事務對自增的影響
在向帶有自增的表插入數據時,如果因事務失敗而導致回滾,則已“占用”的自增序數不會歸還,導致數據庫數據的自增數看起來有“斷層”的感覺。
系列教程
NewLife.XCode教程系列[2019版]
- 增刪改查入門。快速展現用法,代碼配置連接字符串
- 數據模型文件。建立表格字段和索引,名字以及數據類型規范,推薦字段(時間,用戶,IP)
- 實體類詳解。數據類業務類,泛型基類,接口
- 功能設置。連接字符串,調試開關,SQL日志,慢日志,參數化,執行超時。代碼與配置文件設置,連接字符串局部設置
- 反向工程。自動建立數據庫數據表
- 數據初始化。InitData寫入初始化數據
- 高級增刪改。重載攔截,自增字段,Valid驗證,實體模型(時間,用戶,IP)
- 臟數據。如何產生,怎么利用
- 增量累加。高並發統計
- 事務處理。單表和多表,不同連接,多種寫法
- 擴展屬性。多表關聯,Map映射
- 高級查詢。復雜條件,分頁,自定義擴展FieldItem,查總記錄數,查匯總統計
- 數據層緩存。Sql緩存,更新機制
- 實體緩存。全表整理緩存,更新機制
- 對象緩存。字典緩存,適用用戶等數據較多場景。
- 百億級性能。字段精煉,索引完備,合理查詢,充分利用緩存
- 實體工廠。元數據,通用處理程序
- 角色權限。Membership
- 導入導出。Xml,Json,二進制,網絡或文件
- 分表分庫。常見拆分邏輯
- 高級統計。聚合統計,分組統計
- 批量寫入。批量插入,批量Upsert,異步保存
- 實體隊列。寫入級緩存,提升性能。
- 備份同步。備份數據,恢復數據,同步數據
- 數據服務。提供RPC接口服務,遠程執行查詢,例如SQLite網絡版
- 大數據分析。ETL抽取,調度計算處理,結果持久化