func transaction<T>(_ closure: @Sendable @escaping (Database) async throws -> T) async throws -> T { try await self.transaction { db -> EventLoopFuture<T> in let promise = self.eventLoop.makePromise(of: T.self) promise.completeWithTask{ try await closure(db) } return promise.futureResult }.get() } (edited)transaction 関数の引数の closure って、 @Sendable も @escaping も外していいと思うんですけど、正しい考えですかね?self.transaction が返す EventLoopFuture を await future.get() して待機しているから、 この transaction メソッドが終了する時点では、必ず closure の呼び出しも終了しているからです。closure はEventLoopスレッドで実行されるのでconcurrency boundaryは跨いでるけど、 この transaction メソッド自体が async で、呼び出し側は必ず await で待たないといけないし。let closure = { (db) in ... } Task { closure() } try await db.transaction(closure) ↑呼び出し側で勝手にこういうふうにする事ができるか・・・? でもこの場合は、let closure の時点で @Sendable にしないと Task に渡せないから、この心配もないか