论坛首页 Java企业应用论坛

Spring的事务管理难点剖析(4):多线程的困惑

浏览 19734 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-03-17  
houfeng0923 写道
.NET中有一套事务机制。可以创建DependentTransaction,可以跨线程支持事务。
不知道Java有没有类似的机制或实现?

JTA 分布式事务接口。 JTA是可以被Spring配置的。 这个和.net不大一样。
0 请登录后投票
   发表时间:2012-03-17  
quan5yes 写道
我看还是很少需要跨线程同事务的需求吧,反正我是想不到这样的需求。


如果你需要跨数据库提交,或者分步提交。自然就需要多个线程来做了。java是通过JTA来做的。
0 请登录后投票
   发表时间:2012-03-17  
javakatty 写道
那就是说Spring的事务管理是不能跨线程的吗??

基本上不可以。但是这不等于说java就不能做分布式事务了。

分布式事务,java有JTA规范,有分布式事务的仲裁服务。而对于spring来说,配置一个JTA的数据源就行了。事务是否是分布式的,是不需要spring来关心的。
0 请登录后投票
   发表时间:2012-04-01   最后修改:2012-04-01
请问能解释下文中提到的有状态和无状态的意思吗?
0 请登录后投票
   发表时间:2012-04-01  
在绝大多数情况下,Spring的Bean都是单实例的(singleton),单实例Bean的最大好处是线程无关性,不存在多线程并发访问的问题,也就是线程安全的。
0 请登录后投票
   发表时间:2012-06-20  
Spring的事物使用的划分粒度本来就没有按照线程来划分。

大多事物AOP的切入点也是针对业务场景,即业务方法而来。

所以事物隔离级别和传播行为从定义和设计角度根本就没有线程和进程的概念。
只有并发的概念。

并发是一种行为定义,而线程和进程是计算机中并发的实现方式。

Spring的确是通过将有状态的信息进行了封装,
封装成为TransactionStutes对象。而Connection是由Transaction管理的资源。

所以connection作为数据访问资源,分配即私有,释放则共有。
私有是因为它提供了数据库的层面的事物API。
共有是因为它没涉及业务场景的事物。

给大家留两个问题,问题有点难,有比较多的细节,如果搞清楚了,Spring事物也应该全理解了。
情况1
TransactionStatus status1 = beginTransaction();
  sql1执行
  TransactionStatus status2 = beginTransaction();
  sql2执行
  status1.commit();
-------------------
情况2
TransactionStatus status1 = beginTransaction();
  sql1执行
  TransactionStatus status2 = beginTransaction();
  sql2执行
  status2.commit();
-------------------
问题:两种情况,sql1执行?sql2执行?

提醒:事物传播行为不同,结果可能不同。
0 请登录后投票
   发表时间:2012-08-08  
qq123zhz 写道
跨线程的事务,估计要把线程做成阻塞式的。。。


请教,如果改成阻塞式的话用线程的目的是什么?
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics