当前位置: 代码迷 >> Java Web开发 >> Spring 事物update 和 select 的 有关问题,救~
  详细解决方案

Spring 事物update 和 select 的 有关问题,救~

热度:1983   发布时间:2016-04-14 09:05:28.0
Spring 事物update 和 select 的 问题,急救~~~
现在有方法

public class A{
  String id;
  boolean flag = false;
}

public classB{
  String id;
  String idA;// 对象A的id值
}

public void method(){
updateFlag(List<A> aList);
selectFlag(List<B> bList);
}

public void updateFlag(List<A> aList){
   // 更新aList 中对象A的flag 为  true
}

public void selectFlag(List<B> bList){
 // 查询 bList 中B对象属性 idA
 // 更具idA去数据库查询记录 对应的flag
}


用spring管理的事物,selectFlag 中查出来的idA对应的flag 还是  false,  等整个method 方法执行完后再查询数据库 iaA对应的flag就是 true了
问题:  怎么让updateFlag实时更新到数据库啊??


------解决思路----------------------
那就在你的业务方发上或者类上加个@Transactional
业务类上加@Service
如果
@Transactional加在类上,那么这个类的公共方法都有事务,
然后你还要启动spring配置文件,

写个测试类调用
public class Test {

    public static void main(String[] args) {

     ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
    
     A a = (A) ac.getBean("a");

     a.updateFlag()

    }
}

@Transactional
@Service
public class A{
  String id;
  boolean flag = false;
}
 
public classB{
  String id;
  String idA;// 对象A的id值
}
 
public void method(){
updateFlag(List<A> aList);
selectFlag(List<B> bList);
}
 
public void updateFlag(List<A> aList){
   // 更新aList 中对象A的flag 为  true
}
 
public void selectFlag(List<B> bList){
 // 查询 bList 中B对象属性 idA
 // 更具idA去数据库查询记录 对应的flag
}
------解决思路----------------------
你想要实现代码一执行,然后,就提交了,那可以不用事务,spring与hibernate的整合,黙认就是这种功能呀。如果不行,你就改一下配置,hibernate.connection.autocommit=true
你这样,试试。
------解决思路----------------------
只要你的事务边界在 method 方法上面就可以保证它们共享单一物理连接,也就在同一个事务中,这个时候不管事务隔离级别是什么我们在同一个事务中看到的状态值都是一致的。

要是感觉它们像是互相不能感知对方的状态,那可能是它们用了两个不同的物理连接也就是两个事务在运行(这时候根据数据源引用上配置的事务隔离级别的不同,有些能感知,有些不能感知)。

至于 Spring 如何来声明事务的边界 (transaction demarcation)我并不清楚,应该是在 xml 配置中完成的,期望其它有实践经验的大神来解答怎么配置合适的事务界定声明。
  相关解决方案