package com.aaa.test; /** * 0.什么是 事物? * 1.事物就是一个业务操作的单位 * 2.事物就是控制一个业务逻辑 要么都执行, 要么都不执行! * 3.事务是以业务逻辑为基础的;一个完整的业务应该对应业务层里的一个方法; 如果业务操作失败,则整个事务回滚; 所以,事务控制是绝对应该放在业务层的;但是,持久层的设计应该遵循一个很重要的原则:持久层应该保证操作的原子性,就是说持久层里的每个方法都应该是不可以分割的。 * * 1.事物的操作? * * 开启手动事物 con.setAutoCommit(false); * * 提交事务? con.commit(); * * 事物的回滚? 在catch 中设置 * * * 2.事物的原理是什么? * 1.手动事物 没有提交 程序无错 数据库无变化 * 2. 程序出错 数据库也没有变化! * 3.事物的特性? (1)原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 (2)一致性(Consistency) 事务前后数据的完整性必须保持一致。 (3)隔离性(Isolation) 事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。 (4)持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响 * *4.事物的隔离级别? * * *5.事物的 脏读 幻读 不可重复读? * * *案例 模拟银行 转账业务 * 张三 13000 * 李四 5000 *张三给李四 转账10000元。 *1.判断张三 是否有10000 *2.张三-10000 李四+10000 * */ import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import org.junit.Test; public class ShiWuDemo { @Test public void Demo() throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection con = DriverManager.getConnection("jdbc:mysql:///qy66?characterEncoding=utf-8", "root", "root"); //开启手动提交! 手动提交之后,即使程序出错,数据库表中的数据也不会发生改变! con.setAutoCommit(false); //判断张三的余额 PreparedStatement ps = con.prepareStatement("select * from bank where money>=10000 and name='张三'"); ResultSet rs = ps.executeQuery(); if (rs.next()) { //转账操作 ps = con.prepareStatement("update bank set money=money-10000 where name='张三'"); ps.executeUpdate(); //int i=1/0; //bug 测试 发现 程序出错 !在数据库中 张三的钱-10000,但是 李四的钱没有变化,银行出事了! 解决方法 开启手动提交 ps = con.prepareStatement("update bank set money=money+10000 where name='李四'"); ps.executeUpdate(); //提交事务 con.commit(); System.out.println("转账成功!"); }else { System.out.println("转账失败!"); } rs.close(); ps.close(); con.close(); } }