MVC开发规范的常见问题

329 阅读2分钟

事务方面的注意事项

分析:事务应该在哪个类中控制?

  • 最好在 service 层中控制(首选)

    不能在 Dao 中控制

    也可以在 Servlet 中控制

  • 控制事务不能在 dao 层控制,因为事务是和业务紧密相关的,在 dao 中没有业务逻辑。

    通常是 N 条 DML 语句共同联合起来才能完成一个完整的事务

    service 层和业务紧密相关。当我们一个业务完全完成之后再提交数据。所以控制事务应该放在 service 层,一般一个方法对应一个完整的事务。方法开始执行,开启事务。方法执行结束,结束事务。业务完全成功则提交。业务中间发生异常则回滚事务。

    (其实 controller 里面也可以开启关闭事务,但是这战线就拉得太长了,范围就扩得太大了,就没必要。)

    (最不应该在 Dao 中控制事务,Dao 也不能控制事务。)

分析:开启事务时怎么在 service 层中获取连接对象?

Connection 要在 Dao 里就关闭吗?

  • 因为在 service 层中控制事务,必须保证 service 方法执行的连接对象和 dao 方法中的连接对象是同一个

    保证一个线程对应一个 Connection (不能让多个线程共享一个连接对象,要不然会导致事务混乱)

    方法一:在方法调用的时候传参Connection 保证 service 和 dao 的连接对象是同一个

    方法二:用 ThreadLocal 的方式

    == 注意 ==

    不能将连接对象声明成单例对象。如果连接对象只有一个,导致所有线程共享同一个连接对象,事务混乱

  • 必须在 service 方法结束的时候,事务结束的时候再讲连接对象关闭,不能在 dao 方法中关闭 Connection

  • dao 的异常必须上抛。因为 service 中需要 catch 来捕获。捕获成功才能进行回滚,保证数据的安全