package main import ( "TsDB2/DB" "fmt" "os" ) type Record struct { DB.BaseModel Name string `tsdb:"32byte"` Age int64 `tsdb:"8byte"` } const dbPath = "wal_rowlevel_test.db" func main() { os.Remove(dbPath) fmt.Println("==============================================") fmt.Println(" WAL 行级记录序列化测试") fmt.Println("==============================================\n") // 打开数据库 db, err := DB.Open(dbPath) if err != nil { panic(err) } defer db.Close() // 禁用自动提交 db.SetAutoCommitDelay(0) // 创建表 tbl, err := DB.UseTable[Record](db, "users") if err != nil { panic(err) } // ========== 测试1: 事务内插入(使用行级 WAL)========== fmt.Println("========== 测试1: 事务内插入 ==========") txn := db.BeginTransaction() for i := 1; i <= 3; i++ { err := tbl.Insert(&Record{ Name: fmt.Sprintf("User%03d", i), Age: int64(20 + i), }) if err != nil { panic(err) } fmt.Printf(" 插入 User%03d\n", i) } // 提交事务 if err := txn.Commit(); err != nil { panic(err) } fmt.Println("✅ 事务提交成功") // 验证数据 count, _ := tbl.Count() fmt.Printf(" 当前行数: %d\n", count) // ========== 测试2: 事务回滚 ========== fmt.Println("\n========== 测试2: 事务回滚 ==========") txn2 := db.BeginTransaction() for i := 4; i <= 6; i++ { err := tbl.Insert(&Record{ Name: fmt.Sprintf("User%03d", i), Age: int64(20 + i), }) if err != nil { panic(err) } fmt.Printf(" 插入 User%03d\n", i) } countBeforeRollback, _ := tbl.Count() fmt.Printf(" 回滚前行数: %d\n", countBeforeRollback) // 回滚 if err := txn2.Rollback(); err != nil { panic(err) } fmt.Println("✅ 事务回滚成功") countAfterRollback, _ := tbl.Count() fmt.Printf(" 回滚后行数: %d\n", countAfterRollback) // ========== 测试3: 重开验证 ========== fmt.Println("\n========== 测试3: 重开验证 ==========") db.Close() db2, err := DB.Open(dbPath) if err != nil { panic(err) } defer db2.Close() tbl2, _ := DB.UseTable[Record](db2, "users") countAfterReopen, _ := tbl2.Count() fmt.Printf(" 重开后行数: %d(应为 3)\n", countAfterReopen) // 验证具体数据 for i := 1; i <= 3; i++ { row, err := tbl2.Find(uint64(i)) if err == nil { fmt.Printf(" Row#%d: Name=%s, Age=%d ✅\n", i, row.Name, row.Age) } else { fmt.Printf(" Row#%d: 不存在 ❌\n", i) } } // 验证回滚的数据不存在 for i := 4; i <= 6; i++ { _, err := tbl2.Find(uint64(i)) if err != nil { fmt.Printf(" Row#%d: 不存在(已回滚)✅\n", i) } else { fmt.Printf(" Row#%d: 存在(回滚失败!)❌\n", i) } } fmt.Println("\n==============================================") fmt.Println(" 测试完成!") fmt.Println("==============================================") }