数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。
事务特性 ACID
1)原子性(atomicity):事务必须是原子工作单元;对其数据修改,要么全都执行,要么全都不执行【最小的工作单位】
2)一致性(consistency):事务在完成时,必须使所有的数据都保持一致状态【同时成功或者同时失败】
3)隔离性(isolation):由并发事务所作的修改必须与任何其他并发事务所作的修改隔离【事务与事务之间相互不影响】
4)持久性(durability):事务完成之后,它对于系统的影响是永久性的【事务一旦提交不可回滚】
核心代码:将JDBC自动提交关闭,改成手动提交,然后在让出错的事务在异常里捕获成回滚。这样保证了提交事务出错数据不改动。从而达到数据的正确性。
// JDBC自动提交关闭,改成手动提交 connection.setAutoCommit(false); // 手动提交 connection.commit(); // 如果事务出错,就让他它回滚 connection.rollback();
详细代码测试:
1 package boom; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.PreparedStatement; 6 import java.sql.ResultSet; 7 import java.sql.SQLException; 8 9 /** 10 * 数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 11 * 原子性:最小的工作单位 12 * 一致性:同时成功或者同时失败 13 * 隔离性:事务与事务之间相互不影响 14 * 持久性:事务一旦提交不可回滚 15 * @author Administrator 16 * 17 */ 18 public class JDBC_test06 { 19 public static void main(String[] args) { 20 // 声明参数 21 String driver = "oracle.jdbc.driver.OracleDriver"; 22 String url = "jdbc:oracle:thin:@localhost:1521:XE"; 23 String username = "scott"; 24 String userpwd = "tiger"; 25 26 // 声明连接 27 Connection connection = null; 28 PreparedStatement ps = null; 29 ResultSet resultSet = null; 30 31 try { 32 //1.加载驱动 33 Class.forName(driver); 34 //2.创建连接 35 connection = DriverManager.getConnection(url, username, userpwd); 36 37 // JDBC自动提交关闭,改成手动提交 38 connection.setAutoCommit(false); 39 //3.发送SQL语句 40 String update01 = "update comm set sal=sal+1000 where id=1"; 41 String update02 = "update comm set saddl=sal-1000 where id=2"; 42 //4.获取资源 43 ps = connection.prepareStatement(update01); 44 int n1 = ps.executeUpdate(); 45 //5.处理结果 46 if(n1>0){ 47 System.out.println("JDBC_test06.main(测试成功01)"); 48 } 49 ps = connection.prepareStatement(update02); 50 int n2 = ps.executeUpdate(); 51 if(n2>0){ 52 System.out.println("JDBC_test06.main(测试成功02)"); 53 } 54 // 手动提交 55 connection.commit(); 56 57 } catch (ClassNotFoundException | SQLException e) { 58 try { 59 // 如果事务出错,就让他它回滚 60 connection.rollback(); 61 } catch (SQLException e1) { 62 // TODO Auto-generated catch block 63 e1.printStackTrace(); 64 } 65 e.printStackTrace(); 66 }finally { 67 try { 68 if(ps!=null) 69 ps.close(); 70 } catch (SQLException e) { 71 e.printStackTrace(); 72 } 73 try { 74 if(connection!=null) 75 connection.close(); 76 } catch (SQLException e) { 77 e.printStackTrace(); 78 } 79 } 80 } 81 }
故意写错第二条SQL语句,但是第一条SQL语句还是可以正常执行。但因为在异常里捕捉了回滚事务。所以数据并无变化