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

guan_tu 2014-12-10 04:28:59
spring +hibernate+struts2整合后,假设在我的DaoImpl类中有如下代码

List list = getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(final Session session)
throws HibernateException, SQLException {
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是同一个吗?
...全文
134 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
whos2002110 2014-12-11
  • 打赏
  • 举报
回复
引用 6 楼 nd707355117 的回复:
[quote=引用 5 楼 whos2002110 的回复:] [quote=引用 4 楼 whos2002110 的回复:] 取决于事务的隔离级别配置加上事务内是否对数据库进行update操作. 你这里就算该方法配置了最高的隔离级别也不会造作成阻塞, 因为你并没有update数据库, 事务方法本身并不具备同步功能, 同步发生在数据库层面. 举个例子: { update table a; sleep(); } 上面这段代码运行在高事务隔离级别内,sleep操作一定要在update 操作后面(数据库事务是在操作表的时候才打开的) 如果有个线程f处于上述sleep阶段,那么: 任何其它线程对于a表的update操作都将阻塞,而不只是该方法. 因为在sleep的时候, 数据库是锁住a表的. 锁要在线程f sleep之后提交了事务才会释放.
好像说错了, 如果是最高的事务隔离级别, 读的时候也会锁表, 不然怎么防止脏读不可重复读这些呢? 记不清楚了,大概这样 [/quote] 谢谢你的回答,但是还有个疑问 如果有方法A { update table a; sleep(); update table b } 当我改完a 表进入sleep时,此时如果有另外一个线程也对 a 表进行操作,那么 另外一个线程此时会阻塞,一直等到 方法A执行完毕吗? [/quote] 这个是肯定的
guan_tu 2014-12-11
  • 打赏
  • 举报
回复
引用 5 楼 whos2002110 的回复:
[quote=引用 4 楼 whos2002110 的回复:] 取决于事务的隔离级别配置加上事务内是否对数据库进行update操作. 你这里就算该方法配置了最高的隔离级别也不会造作成阻塞, 因为你并没有update数据库, 事务方法本身并不具备同步功能, 同步发生在数据库层面. 举个例子: { update table a; sleep(); } 上面这段代码运行在高事务隔离级别内,sleep操作一定要在update 操作后面(数据库事务是在操作表的时候才打开的) 如果有个线程f处于上述sleep阶段,那么: 任何其它线程对于a表的update操作都将阻塞,而不只是该方法. 因为在sleep的时候, 数据库是锁住a表的. 锁要在线程f sleep之后提交了事务才会释放.
好像说错了, 如果是最高的事务隔离级别, 读的时候也会锁表, 不然怎么防止脏读不可重复读这些呢? 记不清楚了,大概这样 [/quote] 谢谢你的回答,但是还有个疑问 如果有方法A { update table a; sleep(); update table b } 当我改完a 表进入sleep时,此时如果有另外一个线程也对 a 表进行操作,那么 另外一个线程此时会阻塞,一直等到 方法A执行完毕吗?
whos2002110 2014-12-10
  • 打赏
  • 举报
回复
引用 4 楼 whos2002110 的回复:
取决于事务的隔离级别配置加上事务内是否对数据库进行update操作. 你这里就算该方法配置了最高的隔离级别也不会造作成阻塞, 因为你并没有update数据库, 事务方法本身并不具备同步功能, 同步发生在数据库层面. 举个例子: { update table a; sleep(); } 上面这段代码运行在高事务隔离级别内,sleep操作一定要在update 操作后面(数据库事务是在操作表的时候才打开的) 如果有个线程f处于上述sleep阶段,那么: 任何其它线程对于a表的update操作都将阻塞,而不只是该方法. 因为在sleep的时候, 数据库是锁住a表的. 锁要在线程f sleep之后提交了事务才会释放.
好像说错了, 如果是最高的事务隔离级别, 读的时候也会锁表, 不然怎么防止脏读不可重复读这些呢? 记不清楚了,大概这样
whos2002110 2014-12-10
  • 打赏
  • 举报
回复
取决于事务的隔离级别配置加上事务内是否对数据库进行update操作. 你这里就算该方法配置了最高的隔离级别也不会造作成阻塞, 因为你并没有update数据库, 事务方法本身并不具备同步功能, 同步发生在数据库层面. 举个例子: { update table a; sleep(); } 上面这段代码运行在高事务隔离级别内,sleep操作一定要在update 操作后面(数据库事务是在操作表的时候才打开的) 如果有个线程f处于上述sleep阶段,那么: 任何其它线程对于a表的update操作都将阻塞,而不只是该方法. 因为在sleep的时候, 数据库是锁住a表的. 锁要在线程f sleep之后提交了事务才会释放.
oh_Maxy 2014-12-10
  • 打赏
  • 举报
回复
引用 2 楼 oh_Maxy 的回复:
同步是指多线程对共享资源的使用策略,事务是指数据库操作,两个不一样哦。
我说的“事务是指数据库操作”,可能有点片面,不过我们常用的都是数据事务。
oh_Maxy 2014-12-10
  • 打赏
  • 举报
回复
同步是指多线程对共享资源的使用策略,事务是指数据库操作,两个不一样哦。
sunshingheavy 2014-12-10
  • 打赏
  • 举报
回复
楼主既然说了是用了spring ,那么这个类应该是单例多线程,所以执行这个方法时两个线程是没有半毛钱的关系的,只有在处理全局变量时才会有线程的安全问题。同理,spring会为每个线程绑定一个session所以两个线程的session也毫不相关

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧