当前页面: 开发资料首页 → 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;
多谢各位,接分请!!