Post

With _txlock=immediate in the DSN, mattn/go-sqlite3 sends BEGIN IMMEDIATE for every transaction, read-only ones included. modernc.org/sqlite sends a plain BEGIN when you pass sql.TxOptions{ReadOnly: true}, so reads don't queue behind writers.

0 reposts1 like

Watch out for two traps with ReadOnly: true on one *sql.DB pool: 1) plain BEGIN in SQLite is just DEFERRED and still allows writes unless query_only or mode=ro is set; 2) if MaxOpenConns(1) is set for the writer, read txns still queue in database/sql unless you split a separate ro pool.