首页 /  技术专区  /  Java 宽屏模式 >

JDBC事务

概念:

事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transactionend transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。


特征:

事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


代码:

1、首先准备数据库和表,假设A、B、C在银行里面都会1000元存款:

CREATE TABLE account(
	`id` INT PRIMARY KEY AUTO_INCREMENT,
	`name` VARCHAR(40),
	`money` float
);

INSERT INTO account VALUES(null, 'A', 1000);
INSERT INTO account VALUES(null, 'B', 1000);
INSERT INTO account VALUES(null, 'C', 1000);

2、编写测试代码,模拟A向B转账100元,并在中间制造异常,检测事务是否生效:

package com.allen.test;

import java.sql.*;

public class TestJdbc3 {
    public static void main(String[] args){

        String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf-8";
        String userName = "root";
        String password = "li980314";

        Connection connection = null;

        //1、加载jdbc驱动
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");

            //2、连接数据库,代表数据库
            connection = DriverManager.getConnection(url, userName, password);

            //3、通知数据库开启事务,关闭自动提交sql
            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();

        } catch (Exception e) {
            try {
                //如果出现异常错误,事务回滚
                connection.rollback();
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
            e.printStackTrace();
        } finally{
            //6、关闭连接,释放资源
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

我们在第一条sql和第二条sql中间制造了异常,所以执行完第一条sql之后会报错:

image.png

这时候我们来观察数据库,没有变化:

image.png

我们注释掉异常之后再测试:

//注释掉制造异常
//int i = 1/0;

程序执行正常:

image.png

再来查看数据库变化:

image.png





头像
0/200
图片验证码