Loading

JDBC事务处理

简单概念:要么都成功,要么都失败

ACID原则:保证数据的安全

开启事务
事务提交  commit()
事务回滚  rollback()
关闭事务

转账:
A:1000
B:1000

A(900)   ---100-->    B(1100)

Junit单元测试

依赖

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>

简单实用

@Test注解只有在方法上有效,只要加了这个注解的方法,就可以直接运行!

import org.junit.Test;

public class JdbcACID {

    @Test
    public void T() {
        System.out.println("SUCCESS!!!!!");
    }
}

新建表并插入数据

CREATE TABLE `account`(
  `id` INT PRIMARY KEY,
  `name` VARCHAR(50) NOT NULL,
  `money` FLOAT NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO `account` (`id`, `name`, `money`) VALUES(1,'A',1000);
INSERT INTO `account` (`id`, `name`, `money`) VALUES(2,'B',1000);
INSERT INTO `account` (`id`, `name`, `money`) VALUES(3,'C',1000);

# 开启事务
start transaction ;

# 模拟转账

update account set money=money-100 where name='A';

update account set money=money+100 where name='B';

# 回滚
rollback ;

# 提交
commit;

测试代码(制造异常事件)

    @Test
    public void T(){
        //获取配置信息
        //解决中文乱码
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username="root";
        String password="6113081";
        //提出对象
        Connection connection=null;
        //1.加载驱动
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.链接数据库,其对象就代表了数据库(不安全)
            connection = DriverManager.getConnection(url, username, password);
            //通知数据库开启事务false开启true是关闭
            connection.setAutoCommit(false);
            //预编译开启安全的数据库连接,进行数据库操作
            String sql1="update account set money=money-100 where name='A'";
            connection.prepareStatement(sql1).executeUpdate();
            //此时制造错误
            int i=1/0;

            String sql2="update account set money=money+100 where name='B'";
            connection.prepareStatement(sql2).executeUpdate();
            //提交事务
            connection.commit();//以上两条sql都提交成功就会提交事务,否则进入catch语句执行回滚
            System.out.println("SUCCESS!!!!!!");
        } catch (Exception e) {
            try {
                //出现异常事务提交终止,回滚数据
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //关闭连接释放资源(一定要做)先开的后关
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

输出结果

image

数据库变化

image

测试代码(消除异常事件)

    @Test
    public void T(){
        //获取配置信息
        //解决中文乱码
        String url="jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String username="root";
        String password="6113081";
        //提出对象
        Connection connection=null;
        //1.加载驱动
        try {
            //1.加载驱动
            Class.forName("com.mysql.jdbc.Driver");
            //2.链接数据库,其对象就代表了数据库(不安全)
            connection = DriverManager.getConnection(url, username, password);
            //通知数据库开启事务false开启true是关闭
            connection.setAutoCommit(false);
            //预编译开启安全的数据库连接,进行数据库操作
            String sql1="update account set money=money-100 where name='A'";
            connection.prepareStatement(sql1).executeUpdate();
            //此时制造错误
            //int i=1/0;

            String sql2="update account set money=money+100 where name='B'";
            connection.prepareStatement(sql2).executeUpdate();
            //提交事务
            connection.commit();//以上两条sql都提交成功就会提交事务,否则进入catch语句执行回滚
            System.out.println("SUCCESS!!!!!!");
        } catch (Exception e) {
            try {
                //出现异常事务提交终止,回滚数据
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            //关闭连接释放资源(一定要做)先开的后关
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

输出结果

image

数据库变化

image

posted @ 2022-03-08 20:56  Cn_FallTime  阅读(37)  评论(0编辑  收藏  举报