VO类:
public class Account {
private int aid;
private String aname;
private float amoney;

public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getAname() {
return aname;
}
public void setAname(String aname) {
this.aname = aname;
}
public float getAmoney() {
return amoney;
}
public void setAmoney(float amoney) {
this.amoney = amoney;
}
}dao接口:
public interface Dao {
public void add(int aid,float amoney);
public void sub(int aid,float amoney);
}dao实现:
public class DaoImpl implements Dao {
private DataSource ds;
private Connection con; public void setDs(DataSource ds) {
this.ds = ds;
try {
con = this.ds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
} public void add(int aid, float amoney) {
try {
PreparedStatement ps = con
.prepareStatement("update account set amoney=amoney+? where aid=?");
ps.setFloat(1, amoney);
ps.setInt(2, aid);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}
int a = 1;
int b = a /0;
} public void sub(int aid, float amoney){
try {
PreparedStatement ps = con
.prepareStatement("update account set amoney=amoney-? where aid=?");
ps.setFloat(1, amoney);
ps.setInt(2, aid);
ps.execute();
} catch (SQLException e) {
e.printStackTrace();
}

}}BO接口:
public interface Bo {
public void transAccount(int sid, int oid, float money);
}BO实现:
public class BoImpl implements Bo {
private DaoImpl dao;

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

public void transAccount(int sid, int oid, float money) {
dao.sub(sid, money);
dao.add(oid, money);
}}Spring配置文件:
<bean id="ds" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://localhost:3306/test"></property>
<property name="username" value="root"></property>
<property name="password" value="a"></property>
</bean> <bean id="dao" class="com.dao.DaoImpl">
<property name="ds" ref="ds"></property>
</bean>

<bean id="bo" class="com.bo.BoImpl">
<property name="dao" ref="dao"></property>
</bean>

<bean id="tm" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean> <bean id="tpfb"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="proxyInterfaces">
<list>
<value>com.bo.Bo</value>
</list>
</property>
<property name="target" ref="bo"></property>
<property name="transactionManager" ref="tm"></property>
<property name="transactionAttributes">
<props>
<prop key="transAccount">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>测试类:
public class Test { public static void main(String[] args) {
ApplicationContext app = new FileSystemXmlApplicationContext(
"src/applicationContext.xml");
Bo bo = (Bo) app.getBean("tpfb");
bo.transAccount(1,2,10);

}}
正常执行没有问题,当我把DAO中的add方法中表的字段名写错时有异常,但事务并没有回滚,sub方法仍然执行了,请问这是怎么回事?听说Spring只能回滚runtime异常是否属实?还听说程序中如有异常处理spring则不做回滚是否属实?与这个例子是否有关?在网上看了好多仍不太明白,望高手解答此问题,不胜感激~

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【xpchardaway】截止到2008-07-22 21:17:44的历史汇总数据(不包括此帖):
    发帖的总数量:1                        发帖的总分数:20                       每贴平均分数:20                       
    回帖的总数量:1                        得分贴总数量:0                        回帖的得分率:0%                       
    结贴的总数量:1                        结贴的总分数:20                       
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:0                        未结的总分数:0                        
    结贴的百分比:100.00%               结分的百分比:100.00%                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    敬礼!