Skip to content

Instantly share code, notes, and snippets.

@jamesog
Last active January 1, 2019 16:38
Show Gist options
  • Save jamesog/c518a5f4654acc4380b68711f66bf90a to your computer and use it in GitHub Desktop.
Save jamesog/c518a5f4654acc4380b68711f66bf90a to your computer and use it in GitHub Desktop.
HTTP DB Context
package main
import (
"context"
"database/sql"
"log"
"net/http"
_ "github.com/lib/pq"
)
var db *sql.DB
func usersNoCtx() {
txn, err := db.Begin()
if err != nil {
log.Fatal(err)
}
log.Println("In txn")
if _, err := txn.Exec("SELECT pg_sleep(5)"); err != nil {
log.Println("SELECT error:", err)
}
if err := txn.Commit(); err != nil {
log.Fatal(err)
}
log.Println("Committed")
}
func users(ctx context.Context) {
txn, err := db.BeginTx(ctx, &sql.TxOptions{ReadOnly: true})
if err != nil {
log.Fatal(err)
}
log.Println("In txn")
if _, err := txn.ExecContext(ctx, "SELECT pg_sleep(5)"); err != nil {
log.Println("SELECT error:", err)
}
if ctx.Err() != nil {
log.Println("Context cancelled:", ctx.Err())
return
}
if err := txn.Commit(); err != nil {
log.Fatal(err)
}
log.Println("Committed")
}
func handler(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
users(ctx)
w.Write([]byte("OK\n"))
}
func main() {
var err error
db, err = sql.Open("postgres", "dbname=webthing sslmode=disable")
if err != nil {
panic(err)
}
if err := db.Ping(); err != nil {
log.Fatal(err)
}
http.HandleFunc("/", handler)
log.Fatal(http.ListenAndServe("localhost:8088", nil))
}
log_min_messages = info
log_connections = on
log_disconnections = on
log_duration = on
log_line_prefix = '[%m] %u@%d '
log_statement = 'all'
@jamesog
Copy link
Author

jamesog commented Jan 1, 2019

$ gtimeout 0.2 curl localhost:8088
2019/01/01 16:09:20 In txn
2019/01/01 16:09:21 SELECT error: pq: canceling statement due to user request
2019/01/01 16:09:21 Context cancelled: context canceled
$ curl localhost:8088
2019/01/01 16:09:32 In txn
2019/01/01 16:09:37 Committed
OK

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment