明示的なトランザクションの設計

今やってる案件では明示的なトランザクションを利用している。そこでどうやら最悪な設計をしてたっぽい。
トランザクションの制御は、サービスクラスの各メソッドで行っている。各メソッドの開始時点でコネクションを取得しトランザクションスタートし、終了時点でクローズ・コミット、さらに例外に応じた処理をしている。この設計だと一つのトランザクションが複数のメソッドにわたってる場合や、複数のデータベースに接続する場合に処理がかなり複雑になってしまので最悪な設計らしい。
じゃあどうするかというと、コントローラークラスで管理するのがいいらしい。サービスクラスのメソッドの前後で開始・終了の処理を入れるとすっきるする。この方法だと複数メソッド・複数データベースで例外が発生した場合でも複雑にはならない。
ただ、

  1. コントローラークラスから直接コネクションを取得
  2. 取得したコネクションを、サービスクラスのメソッドの引数として渡す

という方法か

  1. コントローラークラスからサービスメソッドのコネクション取得ラッパーメソッドを呼び出し、コネクションをインスタンス変数に設定
  2. サービスクラスのメソッドを呼び出す

という方法のどちらがいいかはまだわからん。プレゼンテーション層にデータアクセス層がこないようにするという意味では後者のほうがいいのか。