站内搜索: 请输入搜索关键词

当前页面: 开发资料首页J2SE 专题【100分】紧急求助:JDBC事务请教

【100分】紧急求助:JDBC事务请教

摘要: 【100分】紧急求助:JDBC事务请教


用的mysql5.0数据库,有一张表Demo:
create table demo (id int, name varchar(50));
想对这张表 insert语句进行事务处理,代码如下:
public class AffairTest {
public static void main(String[] args) throws Exception{
String sql = -#34;-#34;;
Connection conn = null;
try{
conn = DBConnectionManager.getInstance().getConnection();

conn.setAutoCommit(false);
Statement stmt = conn.createStatement();

sql = -#34;insert into demo(id,name) values(1,-#39;aaaa-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);

sql = -#34;insert into demo(id,name) values(2,-#39;bbbb-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);
sql = -#34;insert into demo(id,name) values(3,-#39;cccc-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);
sql = -#34;insert into demo(id,name) values(sss,-#39;dddd-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);

stmt.executeBatch();

conn.commit();

stmt.close();
conn.close();
}catch(Exception e){
conn.rollback();
System.out.println(-#34;=======-#34; + e);
}
}
}///:@

可是前三条记录还是插入了DB,事务回滚没有作用,请问是上面代码有问题,还是mysql本身的自动提交所致,如果是mysql的自动提交所致,请问怎么样一劳永逸的取消掉mysql的自动提交设置,
多谢多谢。分不够可以再加,在线等....


有异常抛出吗?


抛出异常:
java.sql.BatchUpdateException: Unknown column -#39;sss-#39; in -#39;field list-#39;
at com.mysql.jdbc.Statement.executeBatch(Statement.java:874)
at com.china3z.test.AffairTest.main(AffairTest.java:36)


conn.commit();

写在错误捕获后面试试


你的表是什么类型的

mysql只有两种表支持事务


表什么类型?请 interpb 给解释一下好吗?谢谢


好象也不对哦,
//sqlserver
public long runBatchSQL(String sqls[])
{
long l =0;

if(sqls == null || sqls.length == 0)
return l;

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

for (int i=0;i-#60;sqls.length;i++)
stmt.addBatch(sqls[i]);
//stmt.execute(s[i]);

int result[] = stmt.executeBatch();

conn.commit();
conn.setAutoCommit(true);

l = result.length;
stmt.clearBatch();
stmt.close();
stmt = null;

MyPool.freeConnection(conn);
}
catch(SQLException ee)
{
try
{
conn.rollback();
}
catch(SQLException e)
{
MyPool.log(-#34;回滚时出错-#34;+e.getMessage());
}
MyPool.log(-#34;运行sql出错-#34;+ee.getMessage());
}
return l;
}


mysql只有INNODB和BDB两种类型的表支持事务

你再mysql 客户端中执行

show create table demo ;

就可以看到demo表的类型


你的stmt.close();conn.close();都关闭了,还怎么回滚?
把conn.close();放在异常之后


用finally来关闭你的连接


to interpb:执行 show create table demo ,结果为:
CREATE TABLE `demo` (
`id` int(11) default NULL,
`name` varchar(50) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

to mail.Java():把 stmt.close() 和conn.close()隐掉还是一样。


呵呵
问题找到了

ENGINE=MyISAM 说明表的类型是 MyISAM 的 不支持事务

重新建一个表


CREATE TABLE `demo1` (
`id` int(11) default NULL,
`name` varchar(50) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1


就可以了 ,你的代码没有大问题






改成下面,依然老样子:
public class AffairTest {
public static void main(String[] args) throws Exception{
String sql = -#34;-#34;;
Connection conn = null;
Statement stmt = null;
try{
try{
conn = DBConnectionManager.getInstance().getConnection();

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

sql = -#34;insert into demo(id,name) values(1,-#39;aaaa-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);

sql = -#34;insert into demo(id,name) values(2,-#39;bbbb-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);
sql = -#34;insert into demo(id,name) values(3,-#39;cccc-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);
sql = -#34;insert into demo(id,name) values(sss,-#39;dddd-#39;)-#34;;
//stmt.executeUpdate(sql);
stmt.addBatch(sql);

stmt.executeBatch();

conn.commit();
conn.setAutoCommit(true);
}catch(Exception e){
e.printStackTrace();
conn.rollback();
}
}finally{
stmt.close();
conn.close();
}
}
}///:@


mysql缺省安装是不支持事务的。


多谢interpb,请问 能不能把 表的类型直接 从MyISAM 修改为InnoDB 类型,谢谢!!


你能描述的更清楚吗?

try
{
}catch(Exception e)
{
conn.rollback();
}
finally
{
stmt.close() 和conn.close()
}


用alter 语句可以改的




ALTER TABLE demo TYPE=INNODB;



多谢各位,接分请!!


↑返回目录
前一篇: JAVA 中是否有类似于.net MSDN 帮助文档呢?
后一篇: Swing编程,如何实现窗体的打开和关闭!