今天晚上写了一个Java关于Mysql数据库的事物处理类,实现回滚&&部分回滚功能。
Mysql5很好的支持了事物处理功能。不过支持这个功能的只有两种表类型。
分别是BDB,InnoDB。
先建立一个表,名为Kiss,数据为id (int),name(varchar),pop(varchar)。
下面是源码:
import java.sql.*;

public class TestCommit
{
public static void main(String args[])
{
Connection conn=null;
try
{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/kiss";
conn=DriverManager.getConnection(url,"username","password");
boolean autoCommit=conn.getAutoCommit();
//关闭自动提交功能
conn.setAutoCommit(false);
Statement stmt=conn.createStatement();
stmt.executeUpdate("insert into sun values(15,'Hello','Beijing')");
stmt.executeUpdate("insert into sun values(16,'Hi','shanghai')");
ResultSet rs=stmt.executeQuery("select * from sun");
while(rs.next())
{
System.out.print("DeptNo:"+rs.getInt(1));
System.out.print("\tDeptName:"+rs.getString(2));
System.out.println("\tLOC:"+rs.getString(3));
}
//提交事务
conn.commit();
//恢复原来的提交模式
conn.setAutoCommit(autoCommit);
stmt.close();
}catch(Exception e)
{
System.out.println("操作失败!!!任务撤销!!!");
try
{
//回滚、取消前述操作
conn.rollback();
}catch(Exception e1)
{
e1.printStackTrace();
}
}finally
{
try
{
if(conn!=null)
{
conn.close();
}
}catch(Exception e1)
{
e1.printStackTrace();
}
}
}
}
执行第一次执行这个类,id如果不冲突,就可以顺利插入数据,第二次插入,id冲突,则实现回滚。
下面是部分回滚:
import java.sql.*;

public class TestSavepoint
{
public static void main(String args[])
{
Connection conn=null;
try
{
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/kiss";
conn=DriverManager.getConnection(url,"username","password");
boolean autoCommit=conn.getAutoCommit();
//关闭自动提交功能
conn.setAutoCommit(false);
Statement stmt=conn.createStatement();
stmt.executeUpdate("insert into sun values(21,'Hello','Beijing')");
stmt.executeUpdate("insert into sun values(22,'Hi','shanghai')");
Savepoint sp1=conn.setSavepoint("p1");
stmt.executeUpdate("insert into sun values(25,'shiyang','xingtai')");
Savepoint sp2=conn.setSavepoint("p2");
stmt.executeUpdate("insert into sun values(60,'shiyang','baoding')");
ResultSet rs=stmt.executeQuery("select avg(id) from sun");
rs.next();
double avg_id=rs.getDouble(1);
if(avg_id>100)
{
conn.rollback(sp1);
}else if(avg_id>30)
{
conn.rollback(sp2);
}
conn.commit();
rs=stmt.executeQuery("select * from sun");
while(rs.next())
{
System.out.print(rs.getInt(1));
System.out.print("\t"+rs.getString(2).trim());
System.out.println("\t"+rs.getString(3));
}
rs.close();
stmt.close();
}catch(Exception e)
{
System.out.println("Failure.rollback!!!");
try
{
conn.rollback();
}catch(Exception e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}finally
{
try
{
if(conn!=null)
{
conn.close();
}
}catch(Exception e1)
{
e1.printStackTrace();
}
}
}
}
代码测试通过,完美运行。
施杨出品
!!!
本文介绍了一个Java类,用于处理Mysql数据库的事务,包括回滚和部分回滚功能。使用InnoDB表类型创建了一个名为Kiss的表,并通过示例演示了如何进行完整的事务提交及在特定条件下进行部分回滚。

被折叠的 条评论
为什么被折叠?



