一.需求分析

  • 商品修改涉及到两个表的修改:tb_item和tb_item_desc的修改
  • 本小节使用事务完成数据的修改
  • 需要改写DBUtils.go中代码,改写后Dao层代码直接调用PrepareWithTx()函数,在Service层中开启事务,提交事务

二.代码演示

  • 在DBUtils.go中添加代码
  1. //数据库操作的三个对象
  2. var (
  3. db *sql.DB
  4. stmt *sql.Stmt
  5. rows *sql.Rows
  6. tx *sql.Tx
  7. )
  8. //打开数据库连接,不要忘记导入驱动包
  9. func OpenConnWithTx()(err error){
  10. //此处为等号,否则创建局部变量
  11. db,err=sql.Open("mysql","root:smallming@tcp(localhost:3306)/ego")
  12. if err!=nil{
  13. fmt.Println("连接失败",err)
  14. return
  15. }
  16. //开启事务
  17. tx,err=db.Begin()
  18. if err!=nil{
  19. fmt.Println(err)
  20. return
  21. }
  22. return nil
  23. }
  24. //判断返回值是否大于1
  25. func PrepareWithTx(sql string ,args ... interface{}) int{
  26. result,err:=tx.Exec(sql,args...)
  27. if err!=nil{
  28. fmt.Println(err)
  29. return -1
  30. }
  31. count,err:=result.RowsAffected()
  32. if err!=nil{
  33. fmt.Println(err)
  34. return -1
  35. }
  36. return int(count)
  37. }
  38. //提交事务
  39. func CloseConnWithTx(result bool){
  40. if result{
  41. tx.Commit()//提交事务
  42. }else{
  43. tx.Rollback()//回滚事务
  44. }
  45. if rows!=nil{
  46. rows.Close()
  47. }
  48. if stmt!=nil{
  49. stmt.Close()
  50. }
  51. if db!=nil{
  52. db.Close()
  53. }
  54. }