Mediahomedatabase/sqlのコネクション周りの実装をちゃんと調べたdatabase/sqlのコネクション周りの実装をちゃんと調べたShun2018.8.3Goのプロジェクトをやってる中で、database/sqlのトランザクションがどう管理されているのか不安に思ったので、ちゃんと調べてみた。これを参考にコードを追った。ちなみにGoのバージョンは1.9.1https://qiita.com/methane/items/a9803388ff4a5a985b4d登場人物(オブジェクト)sql.DBDBを司るオブジェクト。sql.Txトランザクションを管理するオブジェクト。sql.DB.Begin()すると作られる。sq.driverConnDBのコネクションを司るオブジェクト。コネクションプールから取ってきたコネクション情報が入ってる。driverStmtコネクションプールのステートを司るオブジェクト。こいつをみて、使用中かどうか判断する。実行している流れ通常のクエリ使用時sql.DB.Query(...)の実行してクエリを実行sql.Rowsのオブジェクトが帰ってくるsql.Rows.Close()を実行する。error)が実行されるDB.freeconに使用していないコネクションオープン済みのdriverConnが入っている。sql.DB.conn(...)を実行すると、開いているコネクションがあればそれを返し、なかったら開いているコネクションがないか探索して、それでもなければ新しいコネクションを作って返す(MaxConnectionまでの範囲内で。)driverConnと使用中フラグをあげたdriverStmtをDBオブジェクトに詰める詰めたDBオブジェクトをsql.Rowsに詰めて、sql.Rowsに実行結果を詰めて返す。error)を実行するsql.Txオブジェクトを使って一連のトランザクションでの処理を実行する終わったらsql.Tx.Commit()/sql.Tx.Rollback()を実行する内部の実行内容sql.DB.Begin()実行時sql.DB.conn(...)を実行してdriverConnオブジェクトを取得driverConnをと使用中フラグをあげたdriverStmtをsql.TxにつめてTxオブジェクトを返すsql.DB.Commit()/.Rollback()実行時sql.Txから辿って行って、driverStmtの使用中フラグを下ろすで、どういうことだってばよ。通常のクエリコネクションが開いているやつをコネクションプールから適当に持ってくるコネクションに紐つくステートメントオブジェクトの使用中フラグをあげるクエリを流す流し終わったら(つまり、sql.Rows.Close()が実行されたら)、使用中のフラグを戻して、コネクションプールに返す。この場合、常に、オープンな適当なコネクションがくるので、どのコネクションがくるかはわからない。トランザクショナルなクエリ通常と同じようにコネクションが開いているやつをコネクションプールから適当に持ってくるコネクションに紐つくステートメントオブジェクトの使用中フラグをあげるフラグをあげたコネクションオブジェクトをトランザクションオブジェクトに詰めて、トランザクションオブジェクト返すトランザクションオブジェクトのCommit/Rollbackメソッドが実行されたら、ステートメントオブジェクトの使用中フラグを戻してコネクションプールに返す。参考までにgormの実装は一部のプロジェクトではORMとしてGORMを採用しているのだが、そこでは何をやっているのか気になったので調べてみた。結論から言うと(当たり前だけど)、gormはただ単にdatabase/sqlの各メソッドをラップしているだけなので、処理の流れは同じ。Rows.Close()を自動でやっているだけ。ひとつだけ問題があって、gorm.DB自体がsql.Txとsql.DBの両方の意味をもっているということ。どちらのオブジェクトもクエリを実行できるオブジェクトなので分けたくなかった、という意図だと思われるが、使っている側からしたらトランザクションを開始したオブジェクトなのかわかんないっていう。行ってきましたathena、Digdag、Embulkを使って予算消化済みの広告配信を停止するVueのコンテキストを侵しつつTypeScriptの型を効かせるGo言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで3Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで2Go言語を学習し始めて、簡単なCRUDアプリをクリーンアーキテクチャで作成するまで1AboutWanoグループのエンジニアやデザイナーが使っている技術、興味のある技術、(色んな意味で)はまっている技術などをお伝えしていきます。