fix concurrent read/write
diff --git a/data/data.go b/data/data.go
index 2b6420d..6a3c16c 100644
--- a/data/data.go
+++ b/data/data.go
@@ -104,6 +104,10 @@
 	}, nil
 }
 
+func (d *ApidDb) BeginReadOnly() (*sql.Tx, error) {
+	return d.db.Begin()
+}
+
 func (d *ApidDb) Stats() sql.DBStats {
 	return d.db.Stats()
 }
diff --git a/data/data_test.go b/data/data_test.go
index c6e76d8..9faf07a 100644
--- a/data/data_test.go
+++ b/data/data_test.go
@@ -261,9 +261,13 @@
 func read(db apid.DB) {
 	defer GinkgoRecover()
 	var counter string
-	rows, err := db.Query(`SELECT counter FROM test_1 LIMIT 5`)
+	tx, err := db.BeginReadOnly()
 	Expect(err).Should(Succeed())
-	defer rows.Close()
+	defer tx.Rollback()
+	rows, err := tx.Query(`SELECT counter FROM test_1 LIMIT 5`)
+	Expect(err).Should(Succeed())
+	Expect(rows.Close()).Should(Succeed())
+	Expect(tx.Commit()).Should(Succeed())
 	for rows.Next() {
 		rows.Scan(&counter)
 	}
diff --git a/data_service.go b/data_service.go
index 355566d..4013913 100644
--- a/data_service.go
+++ b/data_service.go
@@ -44,6 +44,7 @@
 	SetConnMaxLifetime(d time.Duration)
 	SetMaxIdleConns(n int)
 	SetMaxOpenConns(n int)
+	BeginReadOnly() (*sql.Tx, error)
 	//Close() error
 	//Stats() sql.DBStats
 	//Driver() driver.Driver