首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

奇怪的spring事物,该怎么处理

2012-03-03 
奇怪的spring事物大家好:最近想看看spring事物,于是照网上说法跟着做了,可始终事物都没起作用,不知道出了

奇怪的spring事物
大家好:
  最近想看看spring事物,于是照网上说法跟着做了,可始终事物都没起作用,不知道出了什么问题,大家帮忙看看,
applicatioinContext.xml配置如下:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>oracle.jdbc.OracleDriver</value>
</property>
<property name="username">
<value>ams</value>
</property>
<property name="password">
<value>ams</value>
</property>
<property name="url">
<value>jdbc:oracle:thin:@dong:1521:DYB</value>
</property>
</bean>

<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<bean id="userDao" abstract="true"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager" ref="transactionManager" />
<property name="target" ref="services" />
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED,-java.lang.Exception</prop>
</props>
</property>
</bean>

<bean id="services" class="com.dyb.text.services.TestServices">
<property name="dao" ref="testdao"></property>
</bean>
<bean id="testdao" class="com.dyb.text.dao.TestDAO">
<property name="source" ref="dataSource"></property>
</bean>
这里面配置了一个service,一个dao,一个事物管理器,一个数据源。
下面是我service代码:
public class TestServices {
private TestDAO dao;

public TestDAO getDao() {
return dao;
}

public void setDao(TestDAO dao) {
this.dao = dao;
}

public void ins(TUser user, TUser updateuser) throws Exception {
dao.update(updateuser);
dao.insert(user);
}
}
其中,ins方法分别调用dao的2个方法,其中update成功,insert失败
下面是我dao的方法
public class TestDAO {
private BasicDataSource source;

public TestDAO() {
}

public BasicDataSource getSource() {
return source;
}

public void setSource(BasicDataSource source) {
this.source = source;
}


public void insert(TUser user) throws Exception {
Connection con;
try {
con = source.getConnection();
PreparedStatement st = con
.prepareStatement("insert into t_user(i,name,sex) values(?,?,?)");
st.setInt(1, user.getId());
st.setString(2, user.getName());
st.setInt(3, user.getSex());
int rs = st.executeUpdate();
st.close();
con.close();
} catch (SQLException e) {
throw e;
}

}

public void update(TUser user) throws Exception {
Connection con;
try {
con = source.getConnection();
PreparedStatement st = con
.prepareStatement("update t_user set name=? where id=?");
st.setString(1, user.getName());
st.setInt(2, user.getId());
int rs = st.executeUpdate();
st.close();
con.close();
} catch (SQLException e) {
throw e;
}
}
}
其中引用了一个数据源,根据数据源来获取连接
下面是我测试方法
ApplicationContext context = new FileSystemXmlApplicationContext(
"WebRoot/WEB-INF/applicationContext.xml");
TUser user = new TUser();
user.setId(3);
user.setName("lxf");
user.setSex(new Integer(0));

TUser updateuser = new TUser();


updateuser.setId(1);
updateuser.setName("fdfdfd");

TestServices dao = (TestServices) context.getBean("services");
dao.ins(user, updateuser);
按道理说,只要有任何一个方法失败都应该回滚事物,为何这里没有回滚啊,我错在哪里?谢谢。

[解决办法]
抛开jdbc不说
1.事务是在一个connection里面的
1.你这是两个方法里面获得各自的conncetion,互相是不会影响的
2.jdbc是默认自动提交,你就算是用一个conncetion,在创建statement之前要将autoCommit设置成false,中间的过程执行完了,再commit,有异常调用rollback

connection.setAutoCommit(false);
connection.commit();
connection.rollback();
[解决办法]
1.jdbc也可以用spring来管理事务的 LZ这样做没错的
2.事务最好放到service层

AOP以下代码放到service类下面

Java code
<property name="transactionManager" ref="transactionManager" /><property name="target" ref="services" /><property name="transactionAttributes"><props><prop key="*">PROPAGATION_REQUIRED,-java.lang.Exception</prop></props></property> 

热点排行