 [](https://travis-ci.com/yedf/dtm) [](https://coveralls.io/github/yedf/dtm?branch=main) [](https://goreportcard.com/report/github.com/yedf/dtm) [](https://pkg.go.dev/github.com/yedf/dtm) [中文版](https://github.com/yedf/dtm/blob/main/README.md) # a golang distributed transaction manager DTM is the first golang open source distributed transaction project. It elegantly resolve the problem of execution out of order. In the microservice architecture, a high-performance and easy-to-use distributed transaction solution is provided. ## characteristic * Stable and reliable + Tested in the production environment, unit test coverage is over 90% * Simple to use + The interface is simple, developers no longer worry about suspension, null compensation, idempotence, etc., and the framework layer takes care of them. * Multi language supported + It is suitable for companies with multi-language stacks. The protocol supports http. Convenient to use in various languages such as go, python, php, nodejs, ruby. * Easy to deploy, easy to expand + Only rely on mysql, easy to deploy, easy to expand horizontally * Multiple distributed transaction protocol supported + TCC: Try-Confirm-Cancel + SAGA: + Reliable news + XA ### [sub-transaction barrier](./doc/barrier-en.md) # Quick start ### installation `git clone https://github.com/yedf/dtm` ### dtm depends on mysql Configure mysql: `cp conf.sample.yml conf.yml # 修改conf.yml` ### Start and run the saga example `go run app/main.go` # start using ### use ``` go // business microservice address const qsBusi = "http://localhost:8081/api/busi_saga" req := &gin.H{"amount": 30} // Microservice payload // The address where DtmServer serves DTM, which is a url saga := dtmcli.NewSaga("http://localhost:8080/api/dtmsvr"). // Add a TransOut sub-transaction, the operation is url: qsBusi+"/TransOut", // compensation operation is url: qsBusi+"/TransOutCompensate" Add(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", req). // Add a TransIn sub-transaction, the operation is url: qsBusi+"/TransOut", // compensation operation is url: qsBusi+"/TransInCompensate" Add(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", req) // Submit the saga transaction, dtm will complete all sub-transactions/rollback all sub-transactions err := saga.Submit() ``` ### Complete example Refer to [examples/quick_start.go](./examples/quick_start.go) ### Wechat Group Please add wechat yedf2008 friends or scan the code to add friends  If you think this project is good, or helpful to you, please give a star! ### Who is using