![license](https://img.shields.io/github/license/yedf/dtm) [![Build Status](https://travis-ci.com/yedf/dtm.svg?branch=main)](https://travis-ci.com/yedf/dtm) [![Coverage Status](https://coveralls.io/repos/github/yedf/dtm/badge.svg?branch=main)](https://coveralls.io/github/yedf/dtm?branch=main) [![Go Report Card](https://goreportcard.com/badge/github.com/yedf/dtm)](https://goreportcard.com/report/github.com/yedf/dtm) [![Go Reference](https://pkg.go.dev/badge/github.com/yedf/dtm.svg)](https://pkg.go.dev/github.com/yedf/dtm) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge-flat.svg)](https://github.com/avelino/awesome-go#database) # [中文文档](http://dtm.pub) # A Lightweight Distributed Transaction Manager ## Who's using DTM [Ivydad](https://ivydad.com) [Eglass](https://epeijing.cn) [Jiou](http://jiou.me) [GoldenData]() ## What is DTM DTM is the first distributed transaction management framework in golang. Unlike other frameworks, DTM provides extremely easy access to HTTP and gRPC, supports multiple language bindings, and handles tricky problems of unordered sub-transactions at the framework level. ## Features * Extremely easy to adopt - Support HTTP and gRPC, provide easy-to-use programing interfaces, lower substantially the barrier of getting started with distributed transactions, newcomers can adopt quickly * Easy to use - Relieving developers from worrying about suspension, null compensation, idempotent transaction, and other tricky problems, the framework layer handles them all * Language-agnostic - Suitable for companies with multiple-language stacks. Easy to write bindings for go, python, php, nodejs, ruby and other languages. * Easy to deploy, easy to extend - DTM depends only on mysql, easy to deploy, cluster, and scale horizontally * Support for multiple distributed transaction protocol - TCC, SAGA, XA, Transactional messages ## DTM vs Other There is no mature open-source distributed transaction framework for non-Java languages. Mature open-source distributed transaction frameworks for Java language include Ali's Seata, Huawei's ServiceComb-Pack, Jingdong's shardingsphere, himly, tcc-transaction, ByteTCC and so on, of which Seata is most widely used. The following is a comparison of the main features of dtm and Seata. | Features | DTM | Seata | Remarks | | :-----: | :----: | :----: | :----: | | Supported languages | Golang, python, php and others | Java | dtm allows easy access from a new language | | Exception handling | [Sub-transaction barrier](https://zhuanlan.zhihu.com/p/388444465) | manual | dtm solves idempotent transaction, hanging, null compensation | | TCC | | | | | XA | | | | | AT | | | AT is similar to XA with better performance but with dirty rollback | | SAGA | Simple mode | complicated state-machine mode | dtm's state-machine mode is being planned | | Transactional Messaging | | | dtm provides Transactional Messaging similar to RocketMQ | | Communication protocols | HTTP, gRPC | Dubbo, no HTTP | | | star count | github stars | github stars | dtm 0.1 is released from 20210604 and under fast development | From the features comparison above, if your language stack includes languages other than Java, then dtm is the one for you. If your language stack is Java, you can also choose to access dtm and use sub-transaction barrier technology to simplify your business development. # Quick start ### Installation `git clone https://github.com/yedf/dtm` ### Configure Mysql `cp conf.sample.yml conf.yml # Modify conf.yml` ### Start The Example `go run app/main.go` # Code ### Use ``` go // business micro-service address const qsBusi = "http://localhost:8081/api/busi_saga" // The address where DtmServer serves DTM, which is a url DtmServer := "http://localhost:8080/api/dtmsvr" req := &gin.H{"amount": 30} // micro-service payload // DtmServer is the address of DTM micro-service saga := dtmcli.NewSaga(DtmServer, dtmcli.MustGenGid(DtmServer)). // add a TransOut subtraction,forward operation with url: qsBusi+"/TransOut", reverse compensation operation with url: qsBusi+"/TransOutCompensate" Add(qsBusi+"/TransOut", qsBusi+"/TransOutCompensate", req). // add a TransIn subtraction, forward operation with url: qsBusi+"/TransIn", reverse compensation operation with url: qsBusi+"/TransInCompensate" Add(qsBusi+"/TransIn", qsBusi+"/TransInCompensate", req) // submit the created saga transaction,dtm ensures all subtractions either complete or get revoked err := saga.Submit() ``` ### Complete Example Refer to [examples/quick_start.go](./examples/quick_start.go) ### Slack You can join the [DTM slack channel here](https://join.slack.com/t/dtm-w6k9662/shared_invite/zt-vkrph4k1-eFqEFnMkbmlXqfUo5GWHWw) ### Give a Star! ⭐ If you think this project is good, or helpful to you, please give a star! ### Who is using
Ivydad Eglass Jiou GoldenData