補充:xorm高級部分
===
### 事務及回滾
- 創建session對象
`sess := Engine.NewSession()`
- 啟動事任
`sess.Begin()`
- 通過session操作數據庫
`sess.Update()`
- 發生錯誤進行回滾
`sess.RollBack()`
- 提交事務
`sess.Commit()`
為什么要用到事務?保證數據的一致性 原子性 隔離性 持久性
我們就吧那個轉賬模塊修改一下吧
```
func TransferAccounts(form,to string,balance float64) error {
session := Engine.NewSession() // 獲得session
defer session.Close() // session會消耗資源 所以要關閉
err := session.Begin() //開啟事務
if err != nil {
return errors.New("session begin error")
}
account := &Account{Name: form}
_, e := Engine.Get(account)
if e != nil {
return e
}
if account.Balance > balance{
account.Balance -= balance
}
account2 := &Account{Name:to}
b, e := Engine.Get(account2)
if b != true || e!= nil{
return errors.New("Error")
}
account2.Balance += balance
_, e = Engine.Where("name = ?",account.Name).Update(account)
if e!=nil{
session.Rollback() //回滾
return e
}
_, e = Engine.Where("name = ?",account2.Name).Update(account2)
if e!=nil{
session.Rollback() //回滾
}
return session.Commit() //提交
}
```
### 這節課程的大塊頭講完了,就是小部分了
#### 統計
- 統計某個表中服務條件的所有記錄條數
`Engine.Count(new(Account))`
- 配合鏈式操作
`Engine.Where("id > 10").Count(new(Account))`
#### 迭代查詢
- 迭代查詢某個表中符合條件的所有記錄
```
Engine.Iterate(new(Account),func(idx int,bean interface{}) {
fmt.Printf("%d,%#v\n",idx,bean.(*Account))
})
```
- 使用Rows對象
`rows,err := Engine.Rows(new(Account))`
```
func row() {
rows, _ := Engine.Rows(new(Account))
defer rows.Close()
account := new(Account)
for rows.Next() {
rows.Scan(account)
}
}
```
#### 常用查詢方法
- 當只有結構中的某個字段的值對你有價值時:
`Engine.Clos("name").Get(..)`
- 忽略指定字段
`Engine.Omit("name").Find(...)`
- 分頁
`Engine.Limit(3,2).Find(...)`
#### 日志記錄
- 開啟日志
`Engine.ShowSQL = true`
- 將日志保存到文件
```
f,_ := os.Create("sql.log")
Engine.Logger = xorm.NewSimpleLogger(f)
```
#### LRU緩存
- 開啟默認LRU緩存
```
cacher := xormNewLRUCacher(xorm.NewMemoryStore(),1000)
Engine.SetDefaultCacher(cacher)
```
#### 事件鉤子
這個去看官方文檔吧....
本次課程代碼:
[https://github.com/dollarkillerx/GolangWebCourseware/tree/xorm](https://github.com/dollarkillerx/GolangWebCourseware/tree/xorm)
- 初認GOlang Web
- 關于環境配置
- 路由
- 路由進階與目錄架構
- 靜態文件服務器
- 自定義Middleware
- 與MySQL起舞
- 主從模式概念
- 部署主從集群
- 分庫分表
- 補充:事務
- 補充:常用SQL示例
- Template使用
- 一些小的,但是要知道的東西
- 調度任務
- 流控算法
- 鑒權
- JWT鑒權前置知識:加密解密
- session
- 文件上傳與下載
- 帶緩存讀寫拷貝io
- 參考
- 寫好的文件上傳
- 文件下載
- 拓展:秒傳功能實現
- 擴展:分塊上傳和斷點續傳
- 擴展:分塊上傳
- 擴展:斷點續傳
- 擴展:分布式存儲
- 部署ceph集群
- cephAuth
- go操作ceph集群
- 擴展:云存儲
- go操作oss
- 補充:xorm框架
- 命令小結
- 補充:xorm框架高級部分
- 補充
- MongoDB
- 基礎概念
- 簡簡單單NoSql
- 操作集合(Collection)
- 操作文檔(Document)
- 帶條件的文檔 db.find
- 復雜條件抽文檔 db.find
- redis
- redis操作
- go操作redis
- (新增)配置鑒權
- 密碼學
- 文件校驗算法
- 未來課程的安排
- RPC實踐
- 爬蟲
- 正則表達式
- 爬取手機號
- 爬取郵箱
- 爬取超鏈接
- 爬取身份證號
- 并發爬圖片
- 擴展:CICD
- GO實現自動化部署系統
- 國際化支持
- 并發帶來問題的解決
- GOWEB小知識
- Sync包講解
- sync.Pool
- 千萬級WebSocket消息推送
- 微服務入門:開篇
- 路由通訊
- RabbitMQ
- RabbitMQ工作原理和轉發模式
- Dcoker 下 RabbitMQ and Ui
- Go操作RabbitMQ
- 初步微服務
- go-micro
- 補充:consul
- 快速入門
- 補充:consul超時
- 微服務架構
- 微服務架構全景圖
- 服務注冊和發現
- raft協議基本概念
- raft協議leader選舉詳解
- raft協議日志復制詳解
- raft協議safefy詳解
- rpc調用個服務監控
- etcd
- 命令行使用
- Golang操作etcd
- GO操作etcd OP方式 (分布式鎖基礎)
- etcd 分布式集群樂觀鎖
- (新增)鑒權
- 服務注冊
- 服務發現原理
- 選項設計模式介紹
- 基于插件的注冊組建
- 課前知識
- etcd注冊開發1
- ffmpeg
- 2.0新的啟航
- 高可用Mysql
- mysql邏輯架構
- 常見的MySQL高可用方案
- 索引
- MYSQL調優
- 什么影響了MYSQL的性能
- Mysql 服務器參數配置
- Go深入并發
- 基本同步原語
- 擴展同步原語
- 原子操作
- M P G 模型
- 簡單的消息總線
- GoMicro入門
- GO任務池編寫
- GO依賴注入
- 一些補充
- golang defer在什么時候執行
- 分布式理論篇(面試吹牛必備)
- CAP理論
- Raft協議
- 保證注冊中心的可靠性
- 鏈路追蹤
- 怎么實現強一致性