|
@@ -0,0 +1,132 @@
|
|
|
|
|
+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("==============================================")
|
|
|
|
|
+}
|