今天做个测试,关于Spring整合Hibernate事务的测试,事务传播方式和隔离级别全部是默认方式。

public class UserServiceImpl implements IUserService {

public void saveOrUpdate(String id) {

extUserService.saveOrderupdate(id);

Users user = dao.queryUsersById(id);

}

}

标红处为另一个Service进行Update操作,当执行完extUserService.saveOrderupdate(id)后,此时Hibernate比没有发送sql通知数据库,而是由org.hibernate.engine.StatefulPersistenceContext记录了下POJO实体的变化,利用自身属性private Map entityEntries,此时产生了脏数据,当程序执行到Users l = dao.queryUsersById(id)时,发现user的属性已经变化了,其实比不是从数据库中持久数据,而是POJO缓存数据,但是此数据产生了脏数据。

当IUserService 中saveOrUpdate执行完毕后,Spring的事务拦截器TransactionInterceptor进行事务统一commit或者rollback。Service调用遵循先进后出,后进先出原则。