Skip to content

Instantly share code, notes, and snippets.

@dadkins-at-dropbox
Created October 8, 2019 21:45
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dadkins-at-dropbox/5b051b9ccb30f115c332c6037d03d63d to your computer and use it in GitHub Desktop.
Save dadkins-at-dropbox/5b051b9ccb30f115c332c6037d03d63d to your computer and use it in GitHub Desktop.
package main
import (
"context"
"database/sql"
"fmt"
"log"
"os"
"time"
_ "github.com/go-sql-driver/mysql"
)
func main() {
if len(os.Args) != 2 {
log.Fatalf("usage: %s <dbname>", os.Args[0])
}
dbName := os.Args[1]
db, err := sql.Open("mysql", "root@/"+dbName)
if err != nil {
log.Fatal(err)
}
defer db.Close()
db.SetMaxOpenConns(100)
db.SetMaxIdleConns(100)
if _, err := db.Exec("drop table if exists t"); err != nil {
log.Fatal(err)
}
if _, err := db.Exec("create table t (id int not null auto_increment primary key)"); err != nil {
log.Fatal(err)
}
ins, err := db.Prepare("insert into t (id) values (null)")
if err != nil {
log.Fatal(err)
}
sel, err := db.Prepare("select count(*) from t")
if err != nil {
log.Fatal(err)
}
for i := 0; i < 10; i++ {
go func() {
for i := 0; ; i++ {
runTx(db, ins)
}
}()
}
for range time.Tick(time.Second) {
var n int
r := sel.QueryRow()
if err := r.Scan(&n); err != nil {
fmt.Println("select", err)
continue
}
fmt.Printf("%d rows (should be 0)\n", n)
}
}
func runTx(db *sql.DB, stmt *sql.Stmt) error {
ctx, cancel := context.WithCancel(context.Background())
quit := make(chan struct{})
done := make(chan struct{})
tx, err := db.BeginTx(ctx, nil)
if err != nil {
fmt.Println("begin", err)
return err
}
defer tx.Rollback()
stmt = tx.Stmt(stmt)
go func() {
timer := time.NewTimer(time.Microsecond)
defer timer.Stop()
select {
case <-quit:
case <-timer.C:
}
cancel()
close(done)
}()
defer func() {
close(quit)
<-done
}()
for i := 0; i < 10; i++ {
if _, err := stmt.Exec(); err != nil {
return err
}
}
_ = tx.Rollback()
return nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment