最近在开发过程中遇到了事物处理的问题,目前项目的代码中对事物的处理存在各种各样的问题:
1、事物边界不明确。具体表现在:有些程序员将事物是写在DAO里面的,而有些是写在Service层的,有些是在控制层(Servlet)的...
特别是写在DAO里面的会存在很大的问题,比如当某个DAO只是完成一系列操作的一部分的时候,在他内部却将整个事物提交了,可能会造成数据的不完整性。
后来花了很大的力气,统一将事物(边界)放在Service层。考虑到一个Service基本上可以看做是一个完整的业务逻辑,所以事物(的边界)放在Service层是比较合理的。
但是还是可能会存在一些问题,比如一个Service只是其他Service的一部分....如果在Service内部将事物提交了,还是会影响数据的完整性....
2、事物的回滚写的乱七八糟的!
3、事物过长。主要表现在两个方面:
1)表结构比较复杂,完成一个业务逻辑,需要操作很多个表,这个时候不得不将事物拉长,如果并发量大了,很容易造成死锁的现象。
2)有些程序员代码写的不规范,在一个方法的开始就conn.setAutoCommit(false);,而下面还要做N多与事物无关的操作!这样无疑是人为的拉长了事物的时间。
---------
在解决以上两个问题,特别是确定事物边界的时候,感觉非常的头痛,这个时候想到只有一个比事物更高层次的东西,才能去合理的、有效的管理这些事物!---这不就是EJB/Spring中的事物管理容器吗?!
想想Spring中的声明式的事物....整个代码看不到一句conn.setAutoCommit(false);....
哎,感叹一下,继续我的JDBC吧。
----------
开源框架之所以出现并流行,是有其道理的,是程序员们在长期"斗争"总结出解决问题(比如上面提到的事物问题)的方法,经验。要学习其精华!
--------------
解耦--开发可维护,可扩展,可复用的代码