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();
}
}