事物的简单介绍!

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

 

posted @ 2019-06-18 21:52  送外卖的小菜鸟  阅读(408)  评论(0编辑  收藏  举报