Skip to content
Immutable transaction isolated sql driver for golang
Branch: master
Clone or download
l3pp4rd Merge pull request #20 from krevels/check_named_value
Support usage of sql.Out params within transaction
Latest commit fde3381 Jun 1, 2019
Type Name Latest commit message Commit time
Failed to load latest commit information.
.travis.yml test with mysql and postgres SQL drivers Jan 9, 2019
LICENSE adds go.mod for future support Feb 12, 2019
Makefile test with mysql and postgres SQL drivers Jan 9, 2019 update documentation regarding dsn string Jul 8, 2015
db.go Remove unused return var cols. Nov 24, 2018
db_go18.go Make query and exec pass through named params May 11, 2018
db_go18_test.go test with mysql and postgres SQL drivers Jan 9, 2019
db_go19.go formatting May 31, 2019
db_test.go test with mysql and postgres SQL drivers Jan 9, 2019
go.mod fixes the module name Feb 12, 2019
mysql_test.go test with mysql and postgres SQL drivers Jan 9, 2019
postgresql_test.go test with mysql and postgres SQL drivers Jan 9, 2019

Build Status GoDoc

Single transaction based sql.Driver for GO

Package txdb is a single transaction based database sql driver. When the connection is opened, it starts a transaction and all operations performed on this sql.DB will be within that transaction. If concurrent actions are performed, the lock is acquired and connection is always released the statements and rows are not holding the connection.

Why is it useful. A very basic use case would be if you want to make functional tests you can prepare a test database and within each test you do not have to reload a database. All tests are isolated within transaction and though, performs fast. And you do not have to interface your sql.DB reference in your code, txdb is like a standard sql.Driver.

This driver supports any sql.Driver connection to be opened. You can register txdb for different sql drivers and have it under different driver names. Under the hood whenever a txdb driver is opened, it attempts to open a real connection and starts transaction. When close is called, it rollbacks transaction leaving your prepared test database in the same state as before.

Given, you have a mysql database called txdb_test and a table users with a username column.

    package main

    import (

        _ ""

    func init() {
        // we register an sql driver named "txdb"
        txdb.Register("txdb", "mysql", "root@/txdb_test")

    func main() {
        // dsn serves as an unique identifier for connection pool
        db, err := sql.Open("txdb", "identifier")
        if err != nil {
        defer db.Close()

        if _, err := db.Exec(`INSERT INTO users(username) VALUES("gopher")`); err != nil {

Every time you will run this application, it will remain in the same state as before.


Usage is mainly intended for testing purposes. See the db_test.go as an example.

In order to run tests, you need a mysql database with a root access without password locally.

make test


See godoc for general API details. See .travis.yml for supported go versions.


Feel free to open a pull request. Note, if you wish to contribute an extension to public (exported methods or types) - please open an issue before to discuss whether these changes can be accepted. All backward incompatible changes are and will be treated cautiously.

The public API is locked since it is an sql.Driver and will not change.


txdb is licensed under the three clause BSD license

You can’t perform that action at this time.