Transaction Isolation in Databases

Transaction Isolation in Databases — Explained with Real Examples If you’ve built anything that talks to a database, you’ve probably used transactions. But once concurrency comes into play — say, two users updating their carts or modifying the same inventory item — things get tricky. To deal with this, databases use isolation levels. In Go or distributed systems, these are often represented like this: const ( LevelDefault IsolationLevel = iota LevelReadUncommitted LevelReadCommitted LevelWriteCommitted LevelRepeatableRead LevelSnapshot LevelSerializable LevelLinearizable ) Each of these isolation levels is meant to prevent certain types of concurrency bugs. To understand when and why to use them, we need to talk about the anomalies they guard against. ...

July 15, 2025

Leader Election with PostgreSQL

What is leader election? A common scenario where leader election is needed is running scheduled (cron) jobs in a backend service that has multiple instances. If you have just one instance, life is simple — that instance runs all the jobs. But when you scale horizontally and run multiple instances, you want to make sure that a scheduled job runs only once, on one leader instance — not duplicated across all instances. This is where leader election comes in. ...

May 8, 2025

Pluralization Example in Go

func main() { text, err := getPluralItemText(1) if err != nil { log.Println(err) } fmt.Println(text) text, err = getPluralItemText(10) if err != nil { log.Println(err) } fmt.Println(text) } func getPluralItemText(count int) (string, error) { msg := plural.Selectf(1, "%d", plural.One, "%[1]d item", plural.Other, "%[1]d items") key := "%d item" tag := "en" lTag := language.MustParse(tag) err := message.Set(lTag, key, msg) if err != nil { return "", err } p := message.NewPrinter(language.English) s := p.Sprintf("%d item", count) return s, nil } Result 1 item 10 items

April 30, 2024

Common Anti-Patterns in Go Web Applications

Loose Coupling Anti-pattern: The Distributed Monolith Avoid splitting your application into microservices before you understand the boundaries. Tactic: Deploy loosely coupled modules. DRY introduces coupling Anti-pattern: Over-Coupling Through “Don’t Repeat Yourself” Adhering strictly to DRY can lead to strong coupling. Tactic: Being DRY in Go A Single Model Couples Your Application Anti-pattern: The Single Model In web applications, the views your API returns (read models) are not the same thing you store in the database (write models). ...

October 30, 2023

Message Ordering Problem in Pub/Sub

Tips for formatting time in Go

August 15, 2023

Formatting Time in Go

Tips for formatting time in Go

March 7, 2023