main.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. package main
  2. import (
  3. "TsDB2/DB"
  4. "fmt"
  5. "os"
  6. )
  7. type Record struct {
  8. DB.BaseModel
  9. Name string `tsdb:"32byte"`
  10. Age int64 `tsdb:"8byte"`
  11. }
  12. const dbPath = "wal_rowlevel_test.db"
  13. func main() {
  14. os.Remove(dbPath)
  15. fmt.Println("==============================================")
  16. fmt.Println(" WAL 行级记录序列化测试")
  17. fmt.Println("==============================================\n")
  18. // 打开数据库
  19. db, err := DB.Open(dbPath)
  20. if err != nil {
  21. panic(err)
  22. }
  23. defer db.Close()
  24. // 禁用自动提交
  25. db.SetAutoCommitDelay(0)
  26. // 创建表
  27. tbl, err := DB.UseTable[Record](db, "users")
  28. if err != nil {
  29. panic(err)
  30. }
  31. // ========== 测试1: 事务内插入(使用行级 WAL)==========
  32. fmt.Println("========== 测试1: 事务内插入 ==========")
  33. txn := db.BeginTransaction()
  34. for i := 1; i <= 3; i++ {
  35. err := tbl.Insert(&Record{
  36. Name: fmt.Sprintf("User%03d", i),
  37. Age: int64(20 + i),
  38. })
  39. if err != nil {
  40. panic(err)
  41. }
  42. fmt.Printf(" 插入 User%03d\n", i)
  43. }
  44. // 提交事务
  45. if err := txn.Commit(); err != nil {
  46. panic(err)
  47. }
  48. fmt.Println("✅ 事务提交成功")
  49. // 验证数据
  50. count, _ := tbl.Count()
  51. fmt.Printf(" 当前行数: %d\n", count)
  52. // ========== 测试2: 事务回滚 ==========
  53. fmt.Println("\n========== 测试2: 事务回滚 ==========")
  54. txn2 := db.BeginTransaction()
  55. for i := 4; i <= 6; i++ {
  56. err := tbl.Insert(&Record{
  57. Name: fmt.Sprintf("User%03d", i),
  58. Age: int64(20 + i),
  59. })
  60. if err != nil {
  61. panic(err)
  62. }
  63. fmt.Printf(" 插入 User%03d\n", i)
  64. }
  65. countBeforeRollback, _ := tbl.Count()
  66. fmt.Printf(" 回滚前行数: %d\n", countBeforeRollback)
  67. // 回滚
  68. if err := txn2.Rollback(); err != nil {
  69. panic(err)
  70. }
  71. fmt.Println("✅ 事务回滚成功")
  72. countAfterRollback, _ := tbl.Count()
  73. fmt.Printf(" 回滚后行数: %d\n", countAfterRollback)
  74. // ========== 测试3: 重开验证 ==========
  75. fmt.Println("\n========== 测试3: 重开验证 ==========")
  76. db.Close()
  77. db2, err := DB.Open(dbPath)
  78. if err != nil {
  79. panic(err)
  80. }
  81. defer db2.Close()
  82. tbl2, _ := DB.UseTable[Record](db2, "users")
  83. countAfterReopen, _ := tbl2.Count()
  84. fmt.Printf(" 重开后行数: %d(应为 3)\n", countAfterReopen)
  85. // 验证具体数据
  86. for i := 1; i <= 3; i++ {
  87. row, err := tbl2.Find(uint64(i))
  88. if err == nil {
  89. fmt.Printf(" Row#%d: Name=%s, Age=%d ✅\n", i, row.Name, row.Age)
  90. } else {
  91. fmt.Printf(" Row#%d: 不存在 ❌\n", i)
  92. }
  93. }
  94. // 验证回滚的数据不存在
  95. for i := 4; i <= 6; i++ {
  96. _, err := tbl2.Find(uint64(i))
  97. if err != nil {
  98. fmt.Printf(" Row#%d: 不存在(已回滚)✅\n", i)
  99. } else {
  100. fmt.Printf(" Row#%d: 存在(回滚失败!)❌\n", i)
  101. }
  102. }
  103. fmt.Println("\n==============================================")
  104. fmt.Println(" 测试完成!")
  105. fmt.Println("==============================================")
  106. }