当前位置: 代码迷 >> J2EE >> 如若一个方法包含在事物中,那么该方法可以视为同步吗
  详细解决方案

如若一个方法包含在事物中,那么该方法可以视为同步吗

热度:65   发布时间:2016-04-17 23:28:16.0
如果一个方法包含在事物中,那么该方法可以视为同步吗?
spring +hibernate+struts2整合后,假设在我的DaoImpl类中有如下代码

List list = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(final Session session)
throws HibernateExceptionSQLException {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SQLQuery query = session.createSQLQuery(sql);
query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return query.list();
}
});
return list;

该代码外层有事物控制,当我执行到 Thread.sleep(10000)时,又有一个线程调用该方法,
1.第二次请求必须等到第一次请求处理结束才能进入该方法吗?
2.如果两次请求同时进入该方法,那么该方法中的session是同一个吗?

------解决思路----------------------
楼主既然说了是用了spring ,那么这个类应该是单例多线程,所以执行这个方法时两个线程是没有半毛钱的关系的,只有在处理全局变量时才会有线程的安全问题。同理,spring会为每个线程绑定一个session所以两个线程的session也毫不相关
------解决思路----------------------
同步是指多线程对共享资源的使用策略,事务是指数据库操作,两个不一样哦。
------解决思路----------------------
引用:
取决于事务的隔离级别配置加上事务内是否对数据库进行update操作. 
你这里就算该方法配置了最高的隔离级别也不会造作成阻塞, 因为你并没有update数据库, 

事务方法本身并不具备同步功能, 同步发生在数据库层面.  
举个例子:
{
 update table a;
 sleep();
}
上面这段代码运行在高事务隔离级别内,sleep操作一定要在update 操作后面(数据库事务是在操作表的时候才打开的)
如果有个线程f处于上述sleep阶段,那么:
任何其它线程对于a表的update操作都将阻塞,而不只是该方法.  因为在sleep的时候, 数据库是锁住a表的. 锁要在线程f sleep之后提交了事务才会释放.

好像说错了,  如果是最高的事务隔离级别,  读的时候也会锁表, 不然怎么防止脏读不可重复读这些呢?  记不清楚了,大概这样
  相关解决方案