最近项目上遇到到好像都是不太好处理的问题,或者说都是我不太熟悉的方面,先记录下来一个个慢慢处理:
1. 关于事务控制,一个事务中新开另外一个事务,跟同时起两个事务去处理,事务的提交上好像有些区别;理论上来说,在 READ COMMITTED情况下,当前事务应该会读取新事务已提交的结果,同时也应该能读到当前事务中自己本身的修改,但实际过程中,出现了读取不到的情况;而起两个事务不嵌套在同一个事务中的情况下可以读取到。如何去控制事务之间,或者事务中读取本身对数据的修改,有哪些因素会对结果造成影响。或者说,读取不到的原因是外部原因造成的?
先确认spring事务管理,事务隔离级别为 READ COMMITTED
oracle 数据库事务隔离级别 READ COMMITTED
首先,对读取不到的情况,使用中间变量,记录每次数据的修改,然后手动对变化部分进行修改。
但是,这样并没有解决究竟为什么没有读取到的情况,按照文档描述:
数据库:READ COMMITTED 允许幻想读、不可重复读,不允许脏读。一个会话只能读取其他事务已提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。
PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事务挂起。
一个方法下顺序执行两个单独事务的方法跟执行一个事务方法中REQUIRES_NEW一个新的事务方法情况不一样。
2.关于异步处理时,数据同步的问题。
在相同线程中进行相互嵌套调用的事务方法工作于相同的事务中。如果这些相互嵌套调用的方法工作在不同的线程中,不同线程下的事务方法工作在独立的事务中。
3.关于项目的SOA ,接口层的划分,以及拆分程度问题。
最基础的拆分源于功能域的拆分,将整合到一起的单个系统拆分成用户,管理,功能子系统。主要为满足实际需要,本身的项目规模而言其实并不需要进行拆分。
为满足异地部署,且各地差异化部署且不公数据库,但是部分数据又需要同步,且各地也有差异化操作。将各地差异化部分单独拆出,各自部署,需同步数据部分两种方法:
a.各地操作后定时实时汇总同步;
b.中心操作后同步到各地。
另外几点:
1.如果采用了一个高端Hibernate,同时采用一个 jdbc,由于前者的session是对后者connection的封装,Spring 会在同一个事务线程让前者的会话封装后者的连接。
但是,如果在同一事务中同时使用两种技术进行读写,那么,有可能会出现hibernate覆盖jdbc操作的情况,因为设计到hibernate一二级缓存。
2.部分特殊方法犹豫事务代理的原因,不能主动的开启一个新的事务(private static),如果直接在事务外使用,有可能没有加入到事务中去。
但是,不能主动的开启新的事务并不是不能加入事务,如在一个事务方法中调用,则仍可根据事务扩散机制加入到事务中去。
3.尽量避免手动显示获取connection进行操作,避免链接泄漏!!!
4.基于 ORM 的框架需要一个事务来触发对象缓存与数据库之间的同步,在没有事务没有提交的时候,并不会触发同步操作。