JDBC的事务管理

1 事务的四个特性

事务代表一个工作单元。

事务管理有四个特性ACID。ACID代表原子性,一致性,隔离性和持久性。

  • 原子性:意味着全部成功或没有成功。
  • 一致性:确保将数据库从一种一致状态带到另一种一致状态。
  • 隔离:确保事务与其他事务隔离。
  • 持久性:是指一旦事务已提交,即使在发生错误,断电等情况下,事务也将保持不变。

2 事务的好处

提交性能:由于事务提交时命中了数据库,因此可以提高性能。

3 JDBC事务管理的方法

在JDBC中,Connection接口提供了管理事务的方法。

方法 说明
void setAutoCommit(boolean status) 设置事务是否自动提交。默认情况下为true,表示每个事务均提交。
void commit() 提交事务。
void rollback() 回滚事务。

4 使用Statement进行JDBC事务管理

4.1 编写测试类

StmtDemo:

package com.yiidian;

import java.io.*;
import java.sql.*;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class StmtDemo {
    public static void main(String args[])throws Exception {
        try {
            Class.forName("com.mysql.jdbc.Driver");

            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "root");

            //开启事务
            con.setAutoCommit(false);

            Statement stmt=con.createStatement();
            stmt.executeUpdate("insert into t_user(username,password) values('eric','123')");
            stmt.executeUpdate("insert into t_user(username,password) values('jack','123')");

            //提交事务
            con.commit();

            con.close();
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

4.2 运行测试

会看到t_user表多了两条记录

5 使用PreparedStatement进行JDBC事务管理

5.1 编写测试类

PsmtDemo:

package com.yiidian;

import java.io.*;
import java.sql.*;

/**
 * 一点教程网 - http://www.yiidian.com
 */
public class PsmtDemo {
    public static void main(String args[])throws Exception {
        try {
            Class.forName("com.mysql.jdbc.Driver");

            Connection con = DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/test", "root", "root");

            //开启事务
            con.setAutoCommit(false);

            PreparedStatement ps=con.prepareStatement("insert into t_user(username,password) values(?,?)");

            BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
            while(true){

                System.out.println("请输入名称:");
                String name=br.readLine();

                System.out.println("请输入密码:");
                String password=br.readLine();

                ps.setString(1,name);
                ps.setString(2,password);

                ps.executeUpdate();

                System.out.println("提交(commit)/回滚(rollback)事务");
                String answer=br.readLine();
                if(answer.equals("commit")){
                    //事务提交
                    con.commit();
                }
                if(answer.equals("rollback")){
                    //事务回滚
                    con.rollback();
                }


                System.out.println("想要继续添加记录么 y/n");
                String ans=br.readLine();
                if(ans.equals("n")){
                    break;
                }

            }

            //提交事务
            con.commit();
            System.out.println("保存成功");

            con.close();
        }catch(Exception e){
            System.out.println(e);
        }
    }
}

5.2 运行测试

最后表中只插入了eric,而没有jack的记录(因为jack数据回滚了)

推荐好课