トランザクション
トランザクションには更新用トランザクションと参照用トランザクションがあります。
同時に使用する場合、更新用と参照用の取得順序が混在しているとコネクションプールからの取得がデッドロックする可能性がありますので、取得順序を統一する必要があります。
また、キャッシュの取得は現在使用しているコネクションとは別コネクションで参照用トランザクションを用いて取得されます。
更新用トランザクション
#![allow(unused)] fn main() { let mut conn = DbConn::new(); conn.begin().await?; conn.commit().await?; }
参照用トランザクション
#![allow(unused)] fn main() { let mut conn = DbConn::new(); conn.begin_read_tx().await?; }
セーブポイント
更新用トランザクションがネストされているとセーブポイントになります。
トランザクションを使用しない場合
意図的にトランザクションを使用していないのか、あるいは実装漏れなのか分からないのはバグの元です。
そのため、トランザクションを使用しない自動コミットの場合は begin_without_transaction() の呼び出しが必要です。
単純なinsert, updateが可能です。クエリーの実行ごとにコネクションが変わっている可能性がありますので、DB接続のセッションの連続性に依存する処理はできません。
また、force_delete では更新用トランザクションが必要です。
#![allow(unused)] fn main() { let mut conn = DbConn::new(); conn.begin_without_transaction().await?; }