问答题
数据库的事务处理(Transaction Handling)
以dept表为例,定义一个事务:往表中添加数据,添加多条。测试事务的有效性。源代码见附件。
要求:将测试结果截图上传。
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; /** * 事务的基本用法 * */ public class TransactionTest { public static void main(String[] args) { Connection conn = null; PreparedStatement ps1 = null; PreparedStatement ps2 = null; try { // 加载驱动类 Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hr?characterEncoding=gb2312", "root", "123456"); conn.setAutoCommit(false); // JDBC中默认是true,自动提交事务 String sql = "insert into Emp(Emp_ID,Emp_Name,Job,Manager_ID,Entry_Date,"; sql += "Salary,Bonus,Dept_ID)"; sql += " values (?,?,?,?,?,?,?,5)";// ?是占位符 ps1 = conn.prepareStatement(sql); ps1.setObject(1, 21); ps1.setObject(2, "李均宓"); ps1.setObject(3, "其他"); ps1.setObject(4, null); ps1.setObject(5, "2014-11-08 12:31:52"); ps1.setObject(6, 3500); ps1.setObject(7, null); ps1.execute(); System.out.println("插入雇员1数据成功。"); try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } sql = "insert into Emp(Emp_ID,Emp_Name,Job,Manager_ID,Entry_Date,"; sql += "Salary,Bonus,Dept_ID)"; sql += " values (?,?,?,?,?,?,?,5)";// ?是占位符 ps2 = conn.prepareStatement(sql); ps2.setObject(1, 22); ps2.setObject(2, "高嘉悦"); ps2.setObject(3, "其他"); ps2.setObject(4, null); ps2.setObject(5, "2015-01-08 09:31:52"); ps2.setObject(6, 2500); ps2.setObject(7, null); ps2.execute(); System.out.println("插入雇员2数据成功。"); conn.commit();// 提交事务 } catch (ClassNotFoundException e) { e.printStackTrace(); try { conn.rollback();// 某一条数据添加失败时,回滚 } catch (SQLException e1) { e1.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (ps1 != null) { ps1.close(); } } catch (SQLException e) { e.printStackTrace(); } try { if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } }