{"id":13412224,"url":"https://github.com/avito-tech/go-transaction-manager","last_synced_at":"2025-08-30T00:14:04.823Z","repository":{"id":62776105,"uuid":"534547400","full_name":"avito-tech/go-transaction-manager","owner":"avito-tech","description":"Transaction manager for GoLang","archived":false,"fork":false,"pushed_at":"2025-08-23T13:59:20.000Z","size":436,"stargazers_count":322,"open_issues_count":2,"forks_count":19,"subscribers_count":11,"default_branch":"main","last_synced_at":"2025-08-24T04:08:49.894Z","etag":null,"topics":["database","go","go-trm","golang","golang-library","nested-transactions","repository-pattern","sql","sqlx","transaction","transaction-manager","trm"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/avito-tech.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-09-09T07:41:52.000Z","updated_at":"2025-08-23T13:53:29.000Z","dependencies_parsed_at":"2023-11-07T00:39:14.904Z","dependency_job_id":"65281695-7f2a-401b-9d80-2ed86e184dbe","html_url":"https://github.com/avito-tech/go-transaction-manager","commit_stats":{"total_commits":88,"total_committers":6,"mean_commits":"14.666666666666666","dds":0.5227272727272727,"last_synced_commit":"fc0b7badd09bbe33e14286c21c0535fd7234dfe4"},"previous_names":[],"tags_count":84,"template":false,"template_full_name":null,"purl":"pkg:github/avito-tech/go-transaction-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avito-tech%2Fgo-transaction-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avito-tech%2Fgo-transaction-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avito-tech%2Fgo-transaction-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avito-tech%2Fgo-transaction-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/avito-tech","download_url":"https://codeload.github.com/avito-tech/go-transaction-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/avito-tech%2Fgo-transaction-manager/sbom","scorecard":{"id":218382,"data":{"date":"2025-08-11","repo":{"name":"github.com/avito-tech/go-transaction-manager","commit":"b1ccb09b1fec8e7e451899f7e57a6c2a5d4e10cb"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Code-Review","score":3,"reason":"Found 5/13 approved changesets -- score normalized to 3","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":0,"reason":"0 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/main.yaml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:96: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:98: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:101: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yaml:111: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yaml:120: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:133: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:147: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yaml:148: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/main.yaml:152: update your workflow using https://app.stepsecurity.io/secureworkflow/avito-tech/go-transaction-manager/main.yaml/main?enable=pin","Info:   0 out of   9 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   3 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 24 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":3,"reason":"7 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GO-2025-3503 / GHSA-qxp5-gwg8-xv66","Warn: Project is vulnerable to: GO-2025-3595 / GHSA-vvgc-356p-c3xw","Warn: Project is vulnerable to: GO-2024-2605 / GHSA-m7wr-2xf7-cm9p","Warn: Project is vulnerable to: GO-2024-2606 / GHSA-mrww-27vc-gghv","Warn: Project is vulnerable to: GO-2023-2402 / GHSA-45x7-px36-x8w8","Warn: Project is vulnerable to: GO-2024-3321 / GHSA-v778-237x-gjrc","Warn: Project is vulnerable to: GO-2025-3487 / GHSA-hcg3-q754-cr77"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T02:03:49.857Z","repository_id":62776105,"created_at":"2025-08-17T02:03:49.857Z","updated_at":"2025-08-17T02:03:49.857Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272784469,"owners_count":24992459,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-29T02:00:10.610Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","go","go-trm","golang","golang-library","nested-transactions","repository-pattern","sql","sqlx","transaction","transaction-manager","trm"],"created_at":"2024-07-30T20:01:22.316Z","updated_at":"2025-08-30T00:14:04.784Z","avatar_url":"https://github.com/avito-tech.png","language":"Go","funding_links":[],"categories":["Database Drivers","数据库驱动程序","Data Integration Frameworks"],"sub_categories":["Interfaces to Multiple Backends","多个后端接口"],"readme":"# Go transaction manager\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/avito-tech/go-transaction-manager.svg)](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/trm/v2)\n[![Test Status](https://github.com/avito-tech/go-transaction-manager/actions/workflows/main.yaml/badge.svg)](https://github.com/avito-tech/go-transaction-manager/actions?query=branch%3Amain)\n[![Coverage Status](https://coveralls.io/repos/github/avito-tech/go-transaction-manager/badge.svg?branch=main)](https://coveralls.io/github/avito-tech/go-transaction-manager?branch=main)\n[![Go Report Card](https://goreportcard.com/badge/github.com/avito-tech/go-transaction-manager)](https://goreportcard.com/report/github.com/avito-tech/go-transaction-manager/)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n\nTransaction manager is an abstraction to coordinate database transaction boundaries.\n\nEasiest way to get the perfect repository.\n\n## Supported implementations\n\n* [database/sql](https://pkg.go.dev/database/sql), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/sql/v2) (\n  Go 1.13)\n* [jmoiron/sqlx](https://github.com/jmoiron/sqlx), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/sqlx/v2) (\n  Go 1.13)\n* [gorm](https://github.com/go-gorm/gorm), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/gorm/v2) (\n  Go 1.18)\n* [mongo-go-driver](https://github.com/mongodb/mongo-go-driver), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/mongo/v2) (\n  Go 1.13)\n* [go-redis/redis](https://github.com/go-redis/redis), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/goredis8/v2) (\n  Go 1.17)\n* [pgx_v4](https://github.com/jackc/pgx/tree/v4), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/pgxv4/v2) (\n  Go 1.16)\n* [pgx_v5](https://github.com/jackc/pgx), [docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/drivers/pgxv5/v2) (\n  Go 1.19)\n\n## Installation\n\n```bash\ngo get github.com/avito-tech/go-transaction-manager/trm/v2\n```\n\nTo install some support database use `go get github.com/avito-tech/go-transaction-manager/drivers/{name}`.\n\nFor example `go get github.com/avito-tech/go-transaction-manager/drivers/sqlx/v2`.\n\n### Backwards Compatibility\n\nThe library is compatible with the most recent two versions of Go.\nCompatibility beyond that is not guaranteed.\n\nThe critical bugs are firstly solved for the most recent two Golang versions and then for older ones if it is simple.\n\n#### Disclaimer: Keep your dependencies up to date, even indirect ones.\n\n`go get -u \u0026\u0026 go mod tidy` helps you.\n\n**Note**: The go-transaction-manager uses some old dependencies to support backwards compatibility for old versions of Go.\n\n## Usage\n\n**To use multiple transactions from different databases**, you need to set CtxKey in [Settings](trm/settings.go)\nby [WithCtxKey](trm/settings/option.go) ([docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/trm/v2)).\n\n**For nested transactions with different transaction managers**, you need to use [ChainedMW](trm/manager/chain.go) ([docs](https://pkg.go.dev/github.com/avito-tech/go-transaction-manager/trm/v2/manager)).\n\n**To skip a transaction rollback due to an error, use [ErrSkip](manager.go#L20) or [Skippable](manager.go#L24)**\n\n### Explanation of the approach [English](https://www.youtube.com/watch?v=aRsea6FFAyA), Russian [article](https://habr.com/ru/companies/avito/articles/727168/) and [youtube](https://www.youtube.com/watch?v=fcdckM5sUxA).\n\n### Examples with an ideal *repository* and nested transactions.\n\n* [database/sql](drivers/sql/example_test.go)\n* [jmoiron/sqlx](drivers/sqlx/example_test.go)\n* [gorm](drivers/gorm/example_test.go)\n* [mongo-go-driver](drivers/mongo/example_test.go)\n* [go-redis/redis](drivers/goredis8/example_test.go)\n* [pgx_v4](drivers/pgxv4/example_test.go)\n* [pgx_v5](drivers/pgxv5/example_test.go)\n\nBelow is an example how to start usage.\n\n```go\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/jmoiron/sqlx\"\n\t_ \"github.com/mattn/go-sqlite3\"\n\n\ttrmsqlx \"github.com/avito-tech/go-transaction-manager/drivers/sqlx/v2\"\n\t\"github.com/avito-tech/go-transaction-manager/trm/v2/manager\"\n)\n\nfunc main() {\n\tdb, err := sqlx.Open(\"sqlite3\", \"file:test?mode=memory\")\n\tcheckErr(err)\n\tdefer db.Close()\n\n\tsqlStmt := `CREATE TABLE IF NOT EXISTS user (user_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, username TEXT);`\n\t_, err = db.Exec(sqlStmt)\n\tcheckErr(err, sqlStmt)\n\n\tr := newRepo(db, trmsqlx.DefaultCtxGetter)\n\tctx := context.Background()\n\ttrManager := manager.Must(trmsqlx.NewDefaultFactory(db))\n\tu := \u0026user{Username: \"username\"}\n\n\terr = trManager.Do(ctx, func(ctx context.Context) error {\n\t\tcheckErr(r.Save(ctx, u))\n\n\t\t// example of nested transactions\n\t\treturn trManager.Do(ctx, func(ctx context.Context) error {\n\t\t\tu.Username = \"new_username\"\n\t\t\treturn r.Save(ctx, u)\n\t\t})\n\t})\n\tcheckErr(err)\n\n\tuserFromDB, err := r.GetByID(ctx, u.ID)\n\tcheckErr(err)\n\n\tfmt.Println(userFromDB)\n}\n\nfunc checkErr(err error, args ...interface{}) {\n\tif err != nil {\n\t\tpanic(fmt.Sprint(append([]interface{}{err}, args...)...))\n\t}\n}\n\ntype repo struct {\n\tdb     *sqlx.DB\n\tgetter *trmsqlx.CtxGetter\n}\n\nfunc newRepo(db *sqlx.DB, c *trmsqlx.CtxGetter) *repo {\n\treturn \u0026repo{db: db, getter: c}\n}\n\ntype user struct {\n\tID       int64  `db:\"user_id\"`\n\tUsername string `db:\"username\"`\n}\n\nfunc (r *repo) GetByID(ctx context.Context, id int64) (*user, error) {\n\tquery := \"SELECT * FROM user WHERE user_id = ?;\"\n\tu := user{}\n\n\treturn \u0026u, r.getter.DefaultTrOrDB(ctx, r.db).GetContext(ctx, \u0026u, r.db.Rebind(query), id)\n}\n\nfunc (r *repo) Save(ctx context.Context, u *user) error {\n\tquery := `UPDATE user SET username = :username WHERE user_id = :user_id;`\n\tif u.ID == 0 {\n\t\tquery = `INSERT INTO user (username) VALUES (:username);`\n\t}\n\n\tres, err := sqlx.NamedExecContext(ctx, r.getter.DefaultTrOrDB(ctx, r.db), r.db.Rebind(query), u)\n\tif err != nil {\n\t\treturn err\n\t} else if u.ID != 0 {\n\t\treturn nil\n\t} else if u.ID, err = res.LastInsertId(); err != nil {\n\t\treturn err\n\t}\n\n\treturn err\n}\n```\n\n## Benchmark\n\n[Comparing](trm/internal/benchmark/with_or_without_trm/README.md) examples with and without trm.\n\n## Contribution\n\n### Requirements\n\n- [golangci-lint](https://golangci-lint.run/welcome/install/)\n- [make](https://www.gnu.org/software/make/#download)\n\n### Local Running\n\n* To install all dependencies use `make go.mod.tidy` or `make go.mod.vendor`.\n* To run all tests use `make test` or `make test.with_real_db` for integration tests.\n\nTo run database by docker, there is [docker-compose.yaml](trm/drivers/test/docker-compose.yaml).\n```bash\ndocker compose -f trm/drivers/test/docker-compose.yaml up\n```\n\nFor full GitHub Actions run, you can use [act](https://github.com/nektos/act).\n\n#### Running old go versions \n\nTo stop Golang upgrading set environment variable `GOTOOLCHAIN=local` .\n\n```sh\ngo install go1.16 # or older version\ngo1.16 install\n```\n\nUse `-mod=readonly` to prevent `go.mod` modification.\n\nTo run tests\n```\ngo1.16 test -race -mod=readonly ./...\n```\n\n### How to bump up Golang version in CI/CD\n\n1. Changes in [.github/workflows/main.yaml](.github/workflows/main.yaml).\n   1. Add all old version of Go in `go-version:` for `tests-units` job.\n   2. Update `go-version:` on current version of Go for `lint` and `tests-integration` jobs.\n2. Update build tags by replacing `build go1.xx` on new version.\n\n\n### Resolve problems with old version of dependencies\n\nTo build `go.mod` compatible for old version use `go mod tidy -compat=1.13` ([docs](https://go.dev/ref/mod#go-mod-tidy)).\n\nHowever, `--compat` doesn't always work correct and we need to set some library versions manually.\n\n1. `go get go.uber.org/multierr@v1.9.0` in [trm](trm), [sql](drivers/sql), [sqlx](drivers/sqlx).\n2. `go get github.com/mattn/go-sqlite3@v1.14.14` in [trm](trm), [sql](drivers/sql), [sqlx](drivers/sqlx).\n3. `go get github.com/stretchr/testify@v1.8.2` in [trm](trm), [sql](drivers/sql), [sqlx](drivers/sqlx), [goredis8](drivers/goredis8), [mongo](drivers/mongo).\n4. `go get github.com/jackc/pgconn@v1.14.2` in [pgxv4](drivers/pgxv4). Golang version was bumped up from 1.12 to 1.17 in pgconn v1.14.3.\n5. `go get golang.org/x/text@v0.13.0` in [pgxv4](drivers/pgxv4).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favito-tech%2Fgo-transaction-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Favito-tech%2Fgo-transaction-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Favito-tech%2Fgo-transaction-manager/lists"}