session_tx.go 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. package xorm
  2. // Begin a transaction
  3. func (session *Session) begin() error {
  4. if session.IsAutoCommit {
  5. tx, err := session.DB().Begin()
  6. if err != nil {
  7. return err
  8. }
  9. session.IsAutoCommit = false
  10. session.IsCommitedOrRollbacked = false
  11. session.Tx = tx
  12. session.saveLastSQL("BEGIN TRANSACTION")
  13. }
  14. return nil
  15. }
  16. // Rollback When using transaction, you can rollback if any error
  17. func (session *Session) rollback() error {
  18. if !session.IsAutoCommit && !session.IsCommitedOrRollbacked {
  19. session.saveLastSQL(session.Engine.dialect.RollBackStr())
  20. session.IsCommitedOrRollbacked = true
  21. return session.Tx.Rollback()
  22. }
  23. return nil
  24. }
  25. // Commit When using transaction, Commit will commit all operations.
  26. func (session *Session) commit() error {
  27. if !session.IsAutoCommit && !session.IsCommitedOrRollbacked {
  28. session.saveLastSQL("COMMIT")
  29. session.IsCommitedOrRollbacked = true
  30. var err error
  31. if err = session.Tx.Commit(); err == nil {
  32. // handle processors after tx committed
  33. closureCallFunc := func(closuresPtr *[]func(interface{}), bean interface{}) {
  34. if closuresPtr != nil {
  35. for _, closure := range *closuresPtr {
  36. closure(bean)
  37. }
  38. }
  39. }
  40. for bean, closuresPtr := range session.afterInsertBeans {
  41. closureCallFunc(closuresPtr, bean)
  42. if processor, ok := interface{}(bean).(AfterInsertProcessor); ok {
  43. processor.AfterInsert()
  44. }
  45. }
  46. for bean, closuresPtr := range session.afterUpdateBeans {
  47. closureCallFunc(closuresPtr, bean)
  48. if processor, ok := interface{}(bean).(AfterUpdateProcessor); ok {
  49. processor.AfterUpdate()
  50. }
  51. }
  52. for bean, closuresPtr := range session.afterDeleteBeans {
  53. closureCallFunc(closuresPtr, bean)
  54. if processor, ok := interface{}(bean).(AfterDeleteProcessor); ok {
  55. processor.AfterDelete()
  56. }
  57. }
  58. cleanUpFunc := func(slices *map[interface{}]*[]func(interface{})) {
  59. if len(*slices) > 0 {
  60. *slices = make(map[interface{}]*[]func(interface{}), 0)
  61. }
  62. }
  63. cleanUpFunc(&session.afterInsertBeans)
  64. cleanUpFunc(&session.afterUpdateBeans)
  65. cleanUpFunc(&session.afterDeleteBeans)
  66. }
  67. return err
  68. }
  69. return nil
  70. }