<!--为业务逻辑Bean配置事务代理 -->
<bean id="testTrans" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="test"/>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>在业务逻辑Bean的方法中有一个insert方法,其中会分别保存两行数据,第一行数据是能成功保存的,第二行数据在程序执行中是会包异常的,由于有Spring 的事务管理,这个时候应该会执行事务回滚,但是实际上我的第一行数据还是被保存了!说明事务管理失效了,这该如何解决了???
解决方案 »
- 怎么讲json字符串转换为java对象集合
- J2EE中重量级框架和轻量级框架的异同
- 导入他人的ssh项目,使用hibernate.hbm2ddl.auto属性为update,不自动创建表结构
- tomcat连接池怎样在web root 目录下使用或配置?
- 我想在本页面提交action之后,根据返回结果,决定在框架集里是只刷新本页,还是还要同时刷新其他页面?
- 关于Hibernate问题
- 为什么无法把null的值置为空值?
- 客户端程序不在JBuilder环境下该怎么调用会话bean?我已在JBuilder下成功部署EJB到WebLogic7,而且客户端程序在JBuilder下可以运行,如脱
- Class<? extends Number>与Class<Number>的区别
- 多线程的synchrchronized锁(基本)
- 求救。。struts2+jquery+json 总是返回error
- hibernate连接oracle11g
首先 你的Service 是不是注入的 你配置的这个事务 testTrans、是不是把RuntimeException在方法中跑出来了,不要catch掉。
Test t = (Test)ctx.getBean("testTrans");
哥啊.....我现在跟你一样事务不启效果啊!!!
我想问一下..都把异常抛到service层来了..还不catch掉的话..那怎么办???还往上抛?
<property name="transactionManager" ref="tranMager"/>
1.2事务管理规则
<property name="transactionAttributes">
<props>
<prop key="add*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="update*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这是我的事务你看看吧,我这个事务大概的意思是,管理以add开头,update开头的方法,-java.lang.Exception为管理事务的异常类型,其他方法都为只读方法<bean id="bookBizPro" parent="superDao">
<property name="target" ref="bookBiz"></property>
</bean>这是事务管理的业务类
当你注入到action中的话只能用bookBizPro,如果你用bookBiz是没有事务管理的
我xml的配置也是你这样的配的!~~麻烦你把java代码也贴出来 下吧...谢谢
不知道业务逻辑Bean是Service层中的bean还是个DAO?
Spring的事务应该配置在Service的bean中;示例:
TestServiceImpl{
TestDao testDao;
public void insert(){
testDao.save();//success
testDao.save();//fail
}
}最后是上面说的异常和数据库问题,需要一一排除;
bean.xml<?xml version="1.0" encoding="GBK"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<!--定義數據源Bean,使用C3P0數據源實現-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost/test"/>
<property name="user" value="root"/>
<property name="password" value="1234"/>
<property name="maxPoolSize" value="40"/>
<property name="minPoolSize" value="1"/>
<property name="initialPoolSize" value="1"/>
<property name="maxIdleTime" value="20"/>
</bean>
<!--配置JDBC數據源的局部事務管理器,使用DataSourceTrannsactionManager類 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="test" class="spring.TestImpl">
<property name="ds" ref="dataSource"/>
</bean>
<!--配置一个业务逻辑组件 -->
<bean id="myService" class="spring.MyServiceImpl">
<!--将DAO组件注入给业务逻辑组件-->
<property name="test" ref="test"/>
</bean> <!--為業務邏輯Bean配置事務代理 -->
<bean id="testTrans" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager"/>
<property name="target" ref="myService"/>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
TestImpl.java实现了Test这个接口(这是DAO),里面就一个insert方法,package spring;import javax.sql.DataSource;import org.springframework.jdbc.core.JdbcTemplate;public class TestImpl implements Test { private DataSource ds; public void setDs(DataSource ds) {
this.ds = ds;
}
public void insert(int i) {
// TODO Auto-generated method stub
JdbcTemplate jt = new JdbcTemplate(ds);
jt.execute("insert into mytable value("+i+")");
}
}
MyServiceImpl.java是业务逻辑类,实现了MyService接口,注入了Test(DAO)package spring;public class MyServiceImpl implements MyService{
private Test test;
public void setTest(Test test) {
this.test = test;
}
@Override
public void insert(int id) {
// TODO Auto-generated method stub
test.insert(id);
test.insert(id);
}
}MainTest.java是一个测试类package spring;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MainTest {
public static void main(String arg[])throws Exception {
ApplicationContext ctx = new ClassPathXmlApplicationContext("bean.xml");
MyService t = (MyService)ctx.getBean("testTrans");
t.insert(1);
}
}运行后出报异常,我不关心这个异常,我只希望数据库中应该是没有数据的,可事实是insert成功了一个。
表名:mytable
表中就一个字段:id (int型 primary key)
JdbcTemplate jt = new JdbcTemplate(ds);
是不是Spring受管的对象?
我的MySQL版本是5.1.X(好像不支持InnoDB表类型) 虽然MySQL中的my.ini文件中default-storage-engine=INNODB
但是建表时默认的还是MyISAM,改成INNODB就会报错。我现在在考虑这个问题了。你可以修改以下表类型试试。
<prop key="add*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>这好像这样