事务方面的注意事项
分析:事务应该在哪个类中控制?
最好在 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 来捕获。捕获成功才能进行回滚,保证数据的安全