2012-03-13 41 views
0

试着格式化Ques.I具有下面提到的查询集合。现在我想要有一些功能可以确保所有查询都应该执行或者甚至不执行一个(如果某种错误发生)我只想维护我的数据库在适当的状态。执行所有查询或什么都不应该执行

con.setAutoCommit(false); 
            String qry = "insert into tblAllotment(Employee_ID,Employee_Name,Area,Building_Name,Flat_Type,Flat_No,Date_Application,Date_Allotment,Admin_Code) values(" + id + ",'" + name[1] + "','" + area + "','" + flat[2] + "','" + flat[1] + "','" + flat[0] + "','" + dte + "','" + date + "'," + uid + ")"; 
            String qry1 = "insert into tblFlat_Report(Flat_No,Area_Code,Employee_ID,Date_Allottment,Admin_Code)values('" + flat[0] + "'," + acode + "," + id + ",'" + date + "'," + uid + ")"; 
            //String qry2="UPDATE tblUser_Report t1 JOIN (SELECT MAX(S_Date) s_date FROM tblUser_Report WHERE Employee_ID = "+id+") t2 ON t1.s_date = t2.s_date SET t1.Status = 'A', t1.S_Date ='"+date+"' WHERE t1.Employee_ID ="+id+""; 
            String qry2 = "insert into tblUser_Report(Employee_ID,Employee_Name,S_Date,Area,Status) values(" + id + ",'" + name[1] + "','" + date + "','" + area + "','A')"; 
            String qry3 = "update tblFlat set Status ='A' where Flat_No='" + flat[0] + "' AND Area_Code=" + acode + " "; 
            String qry4 = "update tblUser set WL_Flag='N' where Employee_ID=" + id + ""; 
            st = con.createStatement(); 
            int i = st.executeUpdate(qry); 
            int j = st.executeUpdate(qry1); 
            int k = st.executeUpdate(qry2); 
            int l = st.executeUpdate(qry3); 
            int m = st.executeUpdate(qry4); 
con.commit(); 

            if (i != 0 & j != 0 & k != 0 & l != 0 & m != 0) { 
             Done = "Data Inserted Successfully...!!!"; 
            } else { 
             System.out.println("Error Occured"); 
            } 
           } catch (SQLException e) { 
con.rollback(); 
            System.out.println(e.getMessage()); 
           } 
    } 

回答

4

您的数据库必须提供交易。如果使用MySQL,则不能使用MyISAM 数据库 表,则必须使用InnoDB之一(例如)。

您在代码开始时开始一个事务,然后检查每个结果。如果出现错误,则发出回滚。如果一切运行良好,则在最后发出提交。

你的样子应该是这样的:

con.setAutoCommit(false); // at the beginning, to prevent auto committing at each insert/update/delete 
// ... your updates, with error checking 
con.commit(); // at the end, only if everything went fine. 

在错误的情况下,调用con.rollback()

+0

如何将我的整个数据库引擎转换为InnoDB? – Shaggy 2012-03-15 08:30:09

+0

事实上,这是一个每表表过程的表,因为您可以在同一个MySQL数据库中的MyISAM和InnoDB中有表。你有几个选择,包括直接修改表的引擎(使用“alter table XXXX ENGINE = InnoDB”),但我强烈建议你阅读这篇文章http://dev.mysql.com/doc/refman/5.0/en/转换表到innodb.html(可能取决于你的MySQL版本),并检查你最好的选择做什么(例如,如果你的数据库服务器在生产中等) – huelbois 2012-03-15 08:46:58

+0

MySQL 5.5的相同文档:http: //dev.mysql.com/doc/refman/5.5/en/converting-tables-to-innodb.html – huelbois 2012-03-15 08:47:53

2

环绕你的查询在尝试捕捉。在try的开始处添加setAutoCommit(false),在末尾添加commit(),在catch块中添加rollback()。

try { 
    conn.setAutoCommit(false); 

    // Execute queries 

    conn.commit(); 
} 
catch (SQLException e) { 
    conn.rollback(); 
} 
+0

试过但没有工作 – Shaggy 2012-03-14 07:31:27

+0

您的数据库是否支持其他用户提到的事务? – Coder 2012-03-14 13:32:00

+0

MySQL数据库引擎被设置为“MyISAM” – Shaggy 2012-03-15 08:25:29