事务
package java_271_JDBC_事务概念_ACID特点_隔离级别_提交commit_回滚rollback_练习;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
-
测试事务的基本概念和用法
*/
public class Demo06 {
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/testjdbc?useSSL=false&characterEncoding=UTF-8”,“root”,“www4152276”); //characterEncoding 字符编码
conn.setAutoCommit(false);//JDBC系统默认事务是自动提交的true ;false手动提交//事务1 ps1 = conn.prepareStatement("insert into t_user(username,pwd) values(?,?)");//注意导入的包名 ps1.setObject(1, "张三"); ps1.setObject(2, "123456"); ps1.execute();//执行 System.out.println("插入一个用户,张三"); try { Thread.sleep(6000);//处理异常 } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); }//休眠一定时间 //事务2 ps2 = conn.prepareStatement("insert into t_user(username,pwd) values(?,?)");//注意导入的包名 ps2.setObject(1, "李四"); ps2.setObject(2, "12345 "); ps2.execute();//执行 System.out.println("插入一个用户,李四"); conn.commit();//提交 } catch (ClassNotFoundException e) { e.printStackTrace(); try { conn.rollback();//回滚 } catch (SQLException e1) { e1.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); } finally { //关闭遵循先进后关原则;一定要分开关闭,这样出现异常不影响后面的程序执行 if(ps2!=null){ try { ps2.close();//关闭 } catch (SQLException e) { e.printStackTrace(); } } if(ps1!=null){ try { ps1.close();//关闭 } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close();//关闭 } catch (SQLException e) { e.printStackTrace(); } } }
}
}
//--------------------------结果-----
//-----------------------如果一个事务错误----------------------
//--------------------测试结果-------------------
清空表
控制台 第二个报异常
数据库写入失败;2个SQL语句在一个事务里面 要么同时写入成功,要么同时失败;回滚到之前的状态