关于数据库的事务(Transactions)的操作

meteor108 2004-08-31 02:26:15
小弟看书上说:
如果设置数据库的autocommit模式为false,就可以在执行commit()函数前用rollback()来撤销数据库操作,我写了一段测试代码,但是结果是rollback()根本就不管用,具体如下:
测试代码如下(后台数据库是MySQL):

public void useCommit(String table)throws SQLException
{
String sql = "UPDATE "+table+" SET Name='newname' WHERE Uid=5";
boolean f = conn.getAutoCommit();
conn.setAutoCommit(false);//Connection conn;
stmt = conn.createStatement();

System.out.println("before change:");
list(table);//这个函数是用来显示数据库的,也就是一个select语句
stmt.executeUpdate(sql);
System.out.println("after change:");
list(table);
System.out.println("then rollback:");
conn.rollback();
list(table);
conn.setAutoCommit(f);
}
现在的结果是:最后两次显示数据库得到的结果是完全一样的,conn.rollback();好像就没有管用,小弟实在不知道是怎么回事啊?还请各位高手指点指点哈!!!
...全文
371 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
meteor108 2004-09-01
  • 打赏
  • 举报
回复
请问一下:分布式事务是什么意思啊?
chesterwoo 2004-09-01
  • 打赏
  • 举报
回复
mysql应该是支持事务的,但不支持分布式事务,不知道最新的版本是不是支持?
baffling 2004-09-01
  • 打赏
  • 举报
回复
gz
hbzyduwu 2004-09-01
  • 打赏
  • 举报
回复
用mysql4.0.18吧,它是支持的.
meteor108 2004-08-31
  • 打赏
  • 举报
回复
大家都来GZGZ嘛
LittleLandlord 2004-08-31
  • 打赏
  • 举报
回复
毕竟Mysql是免费的,而且不仅仅局限于烂Windows。
LittleLandlord 2004-08-31
  • 打赏
  • 举报
回复
我去研究一下Mysql
haitangli4 2004-08-31
  • 打赏
  • 举报
回复
继续关注
meteor108 2004-08-31
  • 打赏
  • 举报
回复
Access是支持事务的,但是MySQL为什么不可以呢?
在MySQL的程序中用supportsTransactions()来判断它是支持事务的啊,我的MySQK版本是mysql Ver 12.22 Distrib 4.0.20a,不知道为什么?
hbzyduwu 2004-08-31
  • 打赏
  • 举报
回复
Access好象不支持事务吧!
meteor108 2004-08-31
  • 打赏
  • 举报
回复
Access可以用了,但是MySQL为什么不可以呢?用supportsTransactions()来判断它是支持事务的啊,我的MySQK版本是mysql Ver 12.22 Distrib 4.0.20a
LittleLandlord 2004-08-31
  • 打赏
  • 举报
回复
String url = "jdbc:odbc:driver={Microsoft Access Driver (*.mdb)};DBQ=D:\\mss1.mdb";
meteor108 2004-08-31
  • 打赏
  • 举报
回复
我用Access它怎么说“现在无法设置属性”啊?
Exception in thread "main" java.sql.SQLException: [Microsoft][ODBC Microsoft Acc
ess Driver]现在无法设置属性
at sun.jdbc.odbc.JdbcOdbc.createSQLException(JdbcOdbc.java:6958)
at sun.jdbc.odbc.JdbcOdbc.standardError(JdbcOdbc.java:7115)
at sun.jdbc.odbc.JdbcOdbc.SQLSetConnectOption(JdbcOdbc.java:5115)
at sun.jdbc.odbc.JdbcOdbcConnection.setAutoCommit(JdbcOdbcConnection.jav
a:651)
at MySQL.useCommit(DB4MySQL.java:161)
at DB4MySQL.main(DB4MySQL.java:194)
haitangli4 2004-08-31
  • 打赏
  • 举报
回复
怎么没人解答?!
LittleLandlord 2004-08-31
  • 打赏
  • 举报
回复
我刚试了,跟我预期的结果一样,操作2失败的话,操作1不会提交成功,我用的Access数据库,你的程序好象也没问题,是不是你看错结果了,或者运行前没把数据库修改回来
meteor108 2004-08-31
  • 打赏
  • 举报
回复
还是不行:
public void useCommit(String table)throws SQLException
{
String sql1 = "UPDATE "+table+" SET Name='newfor5' WHERE Uid=5";
String sql2 = "UPDATE no_such_table SET Name='newfor7' WHERE Uid=7";

boolean f = conn.getAutoCommit();

if (conn.getMetaData().supportsTransactions())
{

try{
conn.setAutoCommit(false);
stmt = conn.createStatement();

stmt.executeUpdate(sql1);
stmt.executeUpdate(sql2);
conn.commit();
}catch(Exception e)
{
System.out.println("failed");
try{
conn.rollback();
}catch(Exception ex){}
}

conn.setAutoCommit(f);
}
else System.out.println("transactions not supportted");
}
结果是第一条更新语句执行了,也修改数据库了,第二条执行失败,最后程序输出为:
failed(但是数据库还是被第一条语句给修改了),痛苦啊
LittleLandlord 2004-08-31
  • 打赏
  • 举报
回复
你想试rollback的话,应该这样试,
conn.setAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conn.createStatement();

stmt.executeUpdate(“alter table …”); //数据库更新操作1

stmt.executeUpdate(“insert into table …”); //数据库更新操作2,在这里故意写错表名,运行完程序,看操作1成功没?

conn.commit(); //事务提交

}catch(Exception ex) {

ex.printStackTrace();

try {

conn.rollback(); //操作不成功则回滚

}catch(Exception e) {

e.printStackTrace();

}

}

haitangli4 2004-08-31
  • 打赏
  • 举报
回复
你用mysql什么版本
老版本mysql是不支持事务的
和这个有关系吗
关注
LittleLandlord 2004-08-31
  • 打赏
  • 举报
回复
stmt.executeUpdate(sql);这里执行完后,数据并没提交,没提交的话,你RollBack没什么意义
meteor108 2004-08-31
  • 打赏
  • 举报
回复
我看过了,修改成功了。
就是stmt.executeUpdate(sql);执行完后我看数据库,这时就已经修改了
加载更多回复(4)

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧