spring PROPAGATION_REQUIRED事务属性问题

nanningxiaoxu 2006-08-04 09:19:00
<bean id="addPerson"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="t2"/></property>
<property name="target"><ref local="addPersonTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="addUser">PROPAGATION_SUPPORTS</prop>
<prop key="addPerson">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="trantTest" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="t2"/></property>
<property name="target"><ref local="trantTestTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="add">PROPAGATION_NEVER</prop>
</props>
</property>

</bean>

trantTest bean 调用 addPerson 方法如下:

public void add()
{
addPerson.addUser();
addPerson.addPerson();
}
问题出来了,如果addPerson.addPerson()出错,addPerson.addUser();方法插入成功数据一样被回滚,
按道理,addUser()运行时候,没有事务,则插入的数据应自动作为一个事务递交,不管后来是否发生异常,
谁来解释一下?
...全文
4173 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saro 2006-09-30
  • 打赏
  • 举报
回复
我想可能是这样

<bean id="trantTest" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="target"><ref local="trantTestTarget"/></property>

你这里的trantTestTarget使用的不是你配置的那个addPerson(有事务增强的bean)而是new了一个AddPerson?
Saro 2006-09-30
  • 打赏
  • 举报
回复
public class TestAdd {

public void add(){
this.es.add1();
this.es.add2();
}

private ExampleService es;

public void setEs(ExampleService es) {
this.es = es;
}
}
Saro 2006-09-30
  • 打赏
  • 举报
回复
奇怪啊,我做的测试是符合配置期望的:

Hibernate: insert into T_Item 。。。 // 第一个方法的数据库写入sql
11:14:01,281 WARN HibernateTransactionManager:601 - Should roll back transaction but cannot - no transaction available //然后抛出了这个警告,第一个方法写入的数据没有被回滚。
<bean id="es"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="exampleService"/>
<property name="transactionAttributes">
<props>
<prop key="add1">PROPAGATION_SUPPORTS</prop>
<prop key="add2">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>

<bean id="testAdd"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" >
<bean class="com.saro.example.web.TestAdd" >
<property name="es" ref="es" />
</bean>
</property>
<property name="transactionAttributes">
<props>
<prop key="add">PROPAGATION_NEVER</prop>
</props>
</property>
</bean>

楼主把你的完整配置和代码贴出来看看。
Saro 2006-09-30
  • 打赏
  • 举报
回复
佩服楼主的钻研精神,没这么测试过,有空也试试。
YuLimin 2006-09-01
  • 打赏
  • 举报
回复
提交公告:关于Spring中声明式或编程式嵌套事务的讨论
YuLimin 2006-09-01
  • 打赏
  • 举报
回复
我知道你在弄复合的事务属性,但是对于一般常用的事务来说,复合事务的确比较难以控制。
你可以试试编程式事务的操作。

http://spring.jactiongroup.net/viewtopic.php?t=2182
nanningxiaoxu 2006-08-25
  • 打赏
  • 举报
回复
老兄,我在测试事务属性
PROPAGATION_NEVER
PROPAGATION_
PROPAGATION_REQUIRED
区别而已,如果按照它们字面的意思,
好象不应该这样的
YuLimin 2006-08-20
  • 打赏
  • 举报
回复
要不在
<prop key="addPerson">PROPAGATION_REQUIRED</prop>
加上+Exception试试,感觉你的逻辑比较乱了。。
<prop key="addPerson">PROPAGATION_REQUIRED,+xxxException</prop>
YuLimin 2006-08-20
  • 打赏
  • 举报
回复
public void add()//PROPAGATION_NEVER不应在事务中进行
{
addPerson.addUser();//PROPAGATION_SUPPORTS支持现在的事务,没有就非事务进行
addPerson.addPerson();//PROPAGATION_REQUIRED表示在目前的事务中执行操作,如果事务不存在就建立一个新的事务。
}

是否逻辑有些混乱啊

67,549

社区成员

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

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