在JAVA中,Connection这个类可以使用事务。但没有TransactionBegin之类的开始方法。
我找到一个setSavepiont的,估计是可以设置开始点的。(因为J2EE是英文版的帮助,看不太明白)。于是就试着写下面代码:String sql1="insert into Tb1 values (x1,x2,x3)";
String sql2="insert into Tb2 values (y1,x2,x3)";
Connection con=db.getConnection(); //db是我写的链接数据库的单例的实例。
try{
Savepoint sp=con.setSavepiont();
int a=db.executeUpdate(sql1); //executeUpdate是更新数据库的方法
int b=db.executeUpdate(sql2);
if (a>0&&b>0)
con.commit();
db.close()
}catch(Exception e){
try{
con.rollback();
}catch(Exception e1){
e1.printSatetrace();
}
}运行的时候总是说什么抽象方法错误,是关于savepoint的。
实在不知道怎么搞下去了,请各位高人指教指教。
谢谢!
我找到一个setSavepiont的,估计是可以设置开始点的。(因为J2EE是英文版的帮助,看不太明白)。于是就试着写下面代码:String sql1="insert into Tb1 values (x1,x2,x3)";
String sql2="insert into Tb2 values (y1,x2,x3)";
Connection con=db.getConnection(); //db是我写的链接数据库的单例的实例。
try{
Savepoint sp=con.setSavepiont();
int a=db.executeUpdate(sql1); //executeUpdate是更新数据库的方法
int b=db.executeUpdate(sql2);
if (a>0&&b>0)
con.commit();
db.close()
}catch(Exception e){
try{
con.rollback();
}catch(Exception e1){
e1.printSatetrace();
}
}运行的时候总是说什么抽象方法错误,是关于savepoint的。
实在不知道怎么搞下去了,请各位高人指教指教。
谢谢!
楼主【siu5】截止到2008-08-03 22:49:05的历史汇总数据(不包括此帖):
发帖的总数量:32 发帖的总分数:625 每贴平均分数:19
回帖的总数量:43 得分贴总数量:2 回帖的得分率:4%
结贴的总数量:32 结贴的总分数:625
无满意结贴数:10 无满意结贴分:410
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:31.25 % 无满意结分率:65.60 %
敬礼!
取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=siu5
int a=0;
int b=0;
try
{
conn = getCon();
conn.setAutoCommit(false);
java.sql.Statement stmt = conn.createStatement();
a = stmt.executeUpdate(sql);
b = stmt.executeUpdate(str);
conn.commit();
conn.setAutoCommit(true);
}
catch (SQLException e)
{
try {
conn.rollback();
System.out.println("rollback");
conn.setAutoCommit(true);
// e.printStackTrace();
} catch (Exception e2) {
// TODO: handle exception
}
}
finally
{
if(a<=0||b<=0)
{
try {
conn.rollback();
System.out.println("rollback");
conn.setAutoCommit(true);
// e.printStackTrace();
} catch (Exception e2) {
// TODO: handle exception
}
}
try {
conn.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}savepoint我只是知道,并没有去实现过,他的作用只是告诉你在什么回滚到什么地方,上面的代码是简单的全回滚
con.rollback(sp);
这样吧
a = stmt.executeUpdate(sql);
b = stmt.executeUpdate(str);
加入了一个10/0的操作,结果代码运行之后,竟然只是抛异常,并没有回滚。
实现事务方面的代码也没有报错!只是说“除数为0”了,然后第一句还是执行了,第二句就转到异常处理那里了。
正常就在末尾调用con.commit()正常的逻辑就是这个样子!关于savePoint,只是一个回滚的保存点,我们rollback可以选择回滚到事务开始或者是回滚到保存点
原来我自己搞错了。
我把Statement写到DB类里面了,其他业务逻辑层是写到Biz的类里面去了。
为了做这个事务,我只好又把Statement写回了Biz的类文件里面去了。这样就可以回滚了。
但不知道我把Statement写到Biz类文件里面是否合乎规范?