• Stars
    star
    156
  • Rank 231,246 (Top 5 %)
  • Language
    Go
  • License
    MIT License
  • Created over 1 year ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Transaction manager for GoLang

Go transaction manager

Go Reference Test Status Coverage Status Go Report Card License

Transaction manager is an abstraction to coordinate database transaction boundaries.

Easiest way to get the perfect repository.

Supported implementations

Installation

go get github.com/avito-tech/go-transaction-manager/trm/v2

To install some support database use go get github.com/avito-tech/go-transaction-manager/drivers/{name}.

For example go get github.com/avito-tech/go-transaction-manager/drivers/sqlx/v2.

Backwards Compatibility

The library is compatible with the most recent two versions of Go. Compatibility beyond that is not guaranteed.

Usage

To use multiple transactions from different databases, you need to set CtxKey in Settings by WithCtxKey (docs).

For nested transactions with different transaction managers, you need to use ChainedMW (docs).

To skip a transaction rollback due to an error, use ErrSkip or Skippable

Explanation of the approach English, Russian article and youtube.

Examples with an ideal repository and nested transactions.

Below is an example how to start usage.

package main

import (
	"context"
	"fmt"

	"github.com/jmoiron/sqlx"
	_ "github.com/mattn/go-sqlite3"

	trmsqlx "github.com/avito-tech/go-transaction-manager/drivers/sqlx/v2"
	"github.com/avito-tech/go-transaction-manager/trm/v2/manager"
)

func main() {
	db, err := sqlx.Open("sqlite3", "file:test?mode=memory")
	checkErr(err)
	defer db.Close()

	sqlStmt := `CREATE TABLE IF NOT EXISTS user (user_id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, username TEXT);`
	_, err = db.Exec(sqlStmt)
	checkErr(err, sqlStmt)

	r := newRepo(db, trmsqlx.DefaultCtxGetter)
	ctx := context.Background()
	trManager := manager.Must(trmsqlx.NewDefaultFactory(db))
	u := &user{Username: "username"}

	err = trManager.Do(ctx, func(ctx context.Context) error {
		checkErr(r.Save(ctx, u))

		// example of nested transactions
		return trManager.Do(ctx, func(ctx context.Context) error {
			u.Username = "new_username"
			return r.Save(ctx, u)
		})
	})
	checkErr(err)

	userFromDB, err := r.GetByID(ctx, u.ID)
	checkErr(err)

	fmt.Println(userFromDB)
}

func checkErr(err error, args ...interface{}) {
	if err != nil {
		panic(fmt.Sprint(append([]interface{}{err}, args...)...))
	}
}

type repo struct {
	db     *sqlx.DB
	getter *trmsqlx.CtxGetter
}

func newRepo(db *sqlx.DB, c *trmsqlx.CtxGetter) *repo {
	return &repo{db: db, getter: c}
}

type user struct {
	ID       int64  `db:"user_id"`
	Username string `db:"username"`
}

func (r *repo) GetByID(ctx context.Context, id int64) (*user, error) {
	query := "SELECT * FROM user WHERE user_id = ?;"
	u := user{}

	return &u, r.getter.DefaultTrOrDB(ctx, r.db).GetContext(ctx, &u, r.db.Rebind(query), id)
}

func (r *repo) Save(ctx context.Context, u *user) error {
	query := `UPDATE user SET username = :username WHERE user_id = :user_id;`
	if u.ID == 0 {
		query = `INSERT INTO user (username) VALUES (:username);`
	}

	res, err := sqlx.NamedExecContext(ctx, r.getter.DefaultTrOrDB(ctx, r.db), r.db.Rebind(query), u)
	if err != nil {
		return err
	} else if u.ID != 0 {
		return nil
	} else if u.ID, err = res.LastInsertId(); err != nil {
		return err
	}

	return err
}

Benchmark

Comparing examples with and without trm.

Contribution

  1. To local development sync dependencies use make go.work.sync.
  2. After finalizing of changes bump up version in all drivers.
  • To install all dependencies use make go.mod.tidy or make go.mod.vendor.
  • To run all tests use make go.test or make go.test.with_real_db for integration tests.

More Repositories

1

playbook

AvitoTech team playbook
1,443
star
2

Paparazzo

Custom iOS camera and photo picker with editing capabilities
Swift
769
star
3

avito-android

Infrastructure of Avito android
Kotlin
356
star
4

Emcee

Emcee is a tool that runs Android and iOS tests in parallel using multiple simulators and emulators across many servers
Swift
323
star
5

bioyino

High performance and high-precision multithreaded StatsD server
Rust
224
star
6

Marshroute

Marshroute is an iOS Library for making your Routers simple but extremely powerful
Swift
220
star
7

netramesh

Ultra light service mesh for any orchestrator
Go
217
star
8

deepsecrets

Secrets scanner that understands code
Python
180
star
9

aqueduct

Framework for create performance-efficient prediction
Python
171
star
10

Mixbox

iOS UI testing framework https://t.me/mixbox_english https://t.me/mixbox_russian
Swift
149
star
11

go-mutesting

Mutation testing for Go source code. Fork from https://github.com/zimmski/go-mutesting
Go
127
star
12

krop

Small widget for image cropping in Instagram-like style
Kotlin
126
star
13

autumn-2021-intern-assignment

98
star
14

internship_backend_2022

Тестовое задание на позицию стажера-бэкендера
Go
84
star
15

avitotech-presentations

84
star
16

Calcifer

Calcifer
Swift
72
star
17

nginx-log-collector

nginx-log-collector
Go
54
star
18

sx-frontend-trainee-assignment

Тестовое задание для стажёра Frontend в команду Seller Experience
53
star
19

Konveyor

Kotlin
48
star
20

auto-backend-trainee-assignment

Тестовое задание на позицию бекенд разработчика в юнит Авто
39
star
21

navigator

Multicluster service mesh solution based on envoy
Go
39
star
22

pulemet

Controlled RPS for interservice communication
Python
39
star
23

android-ui-testing

Kotlin
38
star
24

python-trainee-assignment

Тестовое задание по python
37
star
25

normalize

Go
35
star
26

adv-backend-trainee-assignment

Тестовое задание для стажёра Backend в команду Advertising
29
star
27

internship_frontend_2022

Тестовое задание на позицию стажера-фронтендера
TypeScript
26
star
28

frontend-trainee-assignment-2023

25
star
29

job-backend-trainee-assignment

Тестовое задание на позицию стажера-бекендера в юнит "Работа"
24
star
30

safedeal-frontend-trainee

22
star
31

pg_reindex

Console utility for rebuilding indexes and primary keys for PostgreSQL in automatic mode with analysis of index bloating and without table locking
Python
21
star
32

msg-backend-trainee-assignment

В ДАННЫЙ МОМЕНТ НЕ АКТУАЛЬНО! Тестовое задание на позицию стажера-бекендера
21
star
33

ios-trainee-problem-2021

Тестовое задание для стажера по направлению iOS
19
star
34

verticals

Публичный репозиторий кластера Verticals
19
star
35

pro-fe-trainee-task

Тестовое задание для FE стажера в Авито Pro (Команда ARPU)
19
star
36

android-trainee-task-2021

18
star
37

smart-redis-replication

Go
18
star
38

mi-backend-trainee-assignment

Тестовое задание для стажёра Backend в команду MI
17
star
39

dba-utils

Shell
17
star
40

geo-backend-trainee-assignment

16
star
41

clickhouse-vertica-udx

UDF to seamlessly connect ClickHouse to Vertica using external tables
C++
16
star
42

blur-layout

Support for blurred semitransparent backgrounds in Android.
Assembly
16
star
43

internship

Тестовое задание для iOS-стажировки
15
star
44

prop-types-definition

Patch for prop-types to get property type definition in runtime
JavaScript
15
star
45

abito

Python package for hypothesis testing. Suitable for using in A/B-testing software
Python
14
star
46

tm-backend-trainee

Тестовое задание для стажёра Backend в команду Trade Marketing
13
star
47

mx-backend-trainee-assignment

Тестовое задание для стажёра Backend в команду MX
13
star
48

CommandLineToolkit

Small swift package to create command line tools faster
Swift
13
star
49

antibot-developer-trainee

Тестовая задача для разработчика-стажёра в команду Информационной безопасности Авито для защиты сайта от ботов
13
star
50

bx-backend-trainee-assignment

Тестовое задание на позицию стажера-бекендера в юнит Buyer Experience
12
star
51

internship_ios_2022

Тестовое задание на позицию стажёра в iOS
Swift
10
star
52

patterns-and-practices-abstracts

9
star
53

dba-docs

PLpgSQL
9
star
54

ImageSource

Image abstraction toolkit
Swift
8
star
55

qa-trainee-task

Тестовое задание для стажёра-автоматизатора
8
star
56

gravure

Image processing microservice
Rust
8
star
57

pro-backend-trainee-assignment

7
star
58

puppet-controlrepo-template

Шаблон control repo для Puppet к статье «Инфраструктура как код в Авито: уроки которые мы извлекли»
Ruby
7
star
59

pgmock

PostgreSQL 9.4+ extension for unit tests
PLpgSQL
7
star
60

mi-trainee-task-2021

6
star
61

mi-trainee-task

Тестовое задание для стажера в Market Intelligence.
6
star
62

android-trainee-task

6
star
63

ShopX-QA-trainee

задания к собеседованию
6
star
64

ios-trainee-problem

Задача для стажера на платформу iOS
6
star
65

iOS-trainee-assignment-2023

5
star
66

protocol-writer

Simplest of apps to write timed protocols from interviews
JavaScript
5
star
67

bx-android-trainee-assigment

5
star
68

safedeal-backend-trainee

5
star
69

puppet-module-template

Шаблон Puppet модуля к статье «Инфраструктура как код в Авито: уроки которые мы извлекли»
Ruby
5
star
70

trainspotting

Python Dependency Injector based on interface binding
Python
5
star
71

android-peerlab-moscow

5
star
72

GraphiteClient

Lightweight Swift framework for feeding data into Graphite and statsD.
Swift
4
star
73

video-course-patterns-and-practices

PHP
4
star
74

xrpcd

PostgreSQL RPC built on top of pgq.
Python
4
star
75

doner

Centralized file downloading service
Rust
4
star
76

ap-frontend-trainee-assignment

4
star
77

aaa-ml-datasets-course

Репозиторий курса по созданию датасетов Академии Аналитиков Авито
Jupyter Notebook
3
star
78

moira

Go
3
star
79

qa-trainee-general

Тестовое задание для QA-cтажёра
3
star
80

aaa-ml-sys-design

ML System Design lectures materials
Python
3
star
81

vas-frontend-trainee-assignment

Задание для стажёра в команду VAS
2
star
82

Emcee.cloud.action

GItHub action for emcee.cloud
TypeScript
2
star
83

moira-client

Python
2
star
84

qa-into-CoE-trainee-task

Тестовое задание для стажёра QA в Центр экспертизы по Обеспечению качества
2
star
85

EmceePluginSupport

Swift package that allows to extend Emcee with plugins
Swift
1
star
86

test-asap

Package for easy to start browser testing
JavaScript
1
star
87

moira-web

JavaScript
1
star
88

avito-vault

Puppet модуль, автоматизирующий выкладку секретов из vault.
Ruby
1
star
89

alert-autoconf

Python
1
star
90

brave-new-billing

Тестовое задание для backend-стажёра в юнит Billing, Avito
1
star