事务的四个特性:
1、原子性:从 A 账户转账到 B 账户, A 账户扣了钱, B 账户必须得到这笔钱。比如刚转过去就停电了,转账终止;A、B要么都成功,要么都失败。
2、一致性:A、B两个账户,不管相互之间怎么转钱,两个总金额和不变。
3、隔离性:举一个脏读的例子。。。比如A、B账户各1000,若A向B转500:
update account set money=money+500 where name=‘B’;
update account set money=money-500 where name=‘A’;
当第一条执行完,第二条还没执行,B查询自己的账户,就会发现自己的账户多了500元,如果此时A再回滚自己的操作,
那么B之后再查询自己的账户,就会发现自己的钱和之前并没有变化,还是1000。。
4、持久性:在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。这样可以保证,
所作的修改在任何系统瘫痪时不至于丢失。
上代码:
测试类:thing.java
记住哦,如果没有事务回滚,在 下面定义int i = 3 / 0;后,A的金额会一个减少500,而B的金额不变呢
package com.jdbc.yz; import com.jdbc.yz.until.jdbc.utils; import java.sql.*; public class thing { private static Connection con = null; private static PreparedStatement ps1 = null; private static PreparedStatement ps2 = null; public static void main(String[] args) { // 获取连接 con = utils.getConnection(); try { //开启事物 con.setAutoCommit(false); // 定义sql //lisi 减500,zhangsan 加500 String sql1 = "update one set fee = fee-? where id=?"; String sql2 = "update one set fee = fee+? where id=?"; //获取执行sql对象 ps1 = con.prepareStatement(sql1); ps2 = con.prepareStatement(sql2); //设置参数 ps1.setInt(1,500); ps1.setInt(2,1); ps2.setInt(1,500); ps2.setInt(2,2); //执行sql ps1.executeUpdate(); /* 手动制造异常 int i = 3 / 0; */ ps2.executeUpdate(); //提交事物 con.commit(); } catch (Exception e) { //事物回滚 try { if (con != null) { con.rollback(); } } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { //关闭连接 utils.closed(ps1,con); utils.closed(ps2,null); } } }
工具类utils.java
这个类方面以后减少代码量
package com.jdbc.yz.until.jdbc; import java.io.FileReader; import java.io.IOException; import java.net.URL; import java.sql.*; import java.util.Properties; public class utils { private static String url; private static String user; private static String password; private static String driver; static { try { Properties pro = new Properties(); //类加载器 加载字节码文件进内存 ClassLoader classLoader = utils.class.getClassLoader(); URL res = classLoader.getResource("jdbc.properties"); String path = res.getPath(); System.out.println(path); //有中文我擦//有中文我擦//有中文我擦 //pro.load(new FileReader(path)); pro.load(new FileReader("C:\Users\屈志豪\IdeaProjects\untitled\src\jdbc.properties")); url = pro.getProperty("url"); user = pro.getProperty("user"); driver = pro.getProperty("driver"); password = pro.getProperty("password"); Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } public static Connection getConnection(){ try { return DriverManager.getConnection(url,user,password); } catch (SQLException e) { e.printStackTrace(); } return null; } public static void closed(ResultSet rs, PreparedStatement stmt,Connection conn){ if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } public static void closed(PreparedStatement stmt,Connection conn){ if (stmt != null) { try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
还有一个 jdbc.properties文件
url=jdbc:mysql://localhost:3306/sum user=root password=123456 driver=com.mysql.jdbc.Driver