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则不做回滚是否属实?与这个例子是否有关?在网上看了好多仍不太明白,望高手解答此问题,不胜感激~
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则不做回滚是否属实?与这个例子是否有关?在网上看了好多仍不太明白,望高手解答此问题,不胜感激~
解决方案 »
- 求牛人帮忙解决hibernate annotation级联问题
- 关于Hibernate中多条事务同事处理的常规做法
- 安装了sqlserver的sp4补丁还是出错:socket
- jsf + spring + hibernate 整合错误
- 问题能解决..我的分全送他...[用jsp上传图片.存储在Orcale]..急急急急急急
- 继承一个类出错cannot resolve symbol
- hibernate入门问题
- **请高手指教:Tomcat必须和Apache结合使用吗?**
- 哪里有免费的java电子教材
- 请问struts的config.xml文件一问题
- 请教: weblogic : Error 500--Internal Server Error
- 关于hibernate的问题,请教!!!!
楼主【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 %
敬礼!