You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

default_resource_manager.go 3.4 kB

3 years ago
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package rm
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. import (
  7. "github.com/seata/seata-go/pkg/model"
  8. )
  9. var (
  10. // BranchType -> ResourceManager
  11. resourceManagerMap sync.Map
  12. // singletone defaultResourceManager
  13. defaultRM *defaultResourceManager
  14. )
  15. func init() {
  16. defaultRM = &defaultResourceManager{}
  17. }
  18. type defaultResourceManager struct {
  19. }
  20. // 将事务管理器注册到这里
  21. func RegisterResource(resourceManager model.ResourceManager) {
  22. resourceManagerMap.Store(resourceManager.GetBranchType(), resourceManager)
  23. }
  24. func GetDefaultResourceManager() model.ResourceManager {
  25. return defaultRM
  26. }
  27. func (*defaultResourceManager) getResourceManager(branchType model.BranchType) model.ResourceManager {
  28. rm, ok := resourceManagerMap.Load(branchType)
  29. if !ok {
  30. panic(fmt.Sprintf("No ResourceManager for BranchType: %v", branchType))
  31. }
  32. return rm.(model.ResourceManager)
  33. }
  34. // Commit a branch transaction
  35. func (d *defaultResourceManager) BranchCommit(branchType model.BranchType, xid, branchId int64, resourceId, applicationData string) (model.BranchStatus, error) {
  36. return d.getResourceManager(branchType).BranchCommit(branchType, xid, branchId, resourceId, applicationData)
  37. }
  38. // Rollback a branch transaction
  39. func (d *defaultResourceManager) BranchRollback(branchType model.BranchType, xid string, branchId int64, resourceId, applicationData string) (model.BranchStatus, error) {
  40. return d.getResourceManager(branchType).BranchRollback(branchType, xid, branchId, resourceId, applicationData)
  41. }
  42. // Branch register long
  43. func (d *defaultResourceManager) BranchRegister(branchType model.BranchType, resourceId, clientId, xid, applicationData, lockKeys string) (int64, error) {
  44. return d.getResourceManager(branchType).BranchRegister(branchType, resourceId, clientId, xid, applicationData, lockKeys)
  45. }
  46. // Branch report
  47. func (d *defaultResourceManager) BranchReport(branchType model.BranchType, xid string, branchId int64, status model.BranchStatus, applicationData string) error {
  48. return d.getResourceManager(branchType).BranchReport(branchType, xid, branchId, status, applicationData)
  49. }
  50. // Lock query boolean
  51. func (d *defaultResourceManager) LockQuery(branchType model.BranchType, resourceId, xid, lockKeys string) (bool, error) {
  52. return d.getResourceManager(branchType).LockQuery(branchType, resourceId, xid, lockKeys)
  53. }
  54. // Register a model.Resource to be managed by model.Resource Manager
  55. func (d *defaultResourceManager) RegisterResource(resource model.Resource) error {
  56. return d.getResourceManager(resource.GetBranchType()).RegisterResource(resource)
  57. }
  58. // Unregister a model.Resource from the model.Resource Manager
  59. func (d *defaultResourceManager) UnregisterResource(resource model.Resource) error {
  60. return d.getResourceManager(resource.GetBranchType()).UnregisterResource(resource)
  61. }
  62. // Get all resources managed by this manager
  63. func (d *defaultResourceManager) GetManagedResources() map[string]model.Resource {
  64. var allResource map[string]model.Resource
  65. resourceManagerMap.Range(func(branchType, resourceManager interface{}) bool {
  66. rs := resourceManager.(model.ResourceManager).GetManagedResources()
  67. for k, v := range rs {
  68. rs[k] = v
  69. }
  70. return true
  71. })
  72. return allResource
  73. }
  74. // Get the model.BranchType
  75. func (d *defaultResourceManager) GetBranchType() model.BranchType {
  76. panic("DefaultResourceManager isn't a real ResourceManager")
  77. }

Go Implementation For Seata