JDBC加强

1. 事物

事务使指一组最小逻辑操作单元,里面有多个操作组成。 组成事务的每一部分必须要同时提交成功,如果有一个操作失败,整个操作就回滚。

事务的特性:
原子性,是一个最小逻辑操作单元 !
一致性,事务过程中,数据处于一致状态。
持久性, 事务一旦提交成功,对数据的更改会反映到数据库中。
隔离性, 事务与事务之间是隔离的。

void setAutoCommit(boolean autoCommit) ;  设置事务是否自动提交如果设置为false,表示手动提交事务。
void commit();                          手动提交事务
void rollback() ;                        回滚(出现异常时候,所有已经执行成功的代码需要回退到事务开始前的状态。)
Savepoint setSavepoint(String name)       回滚到指定位置

案例 张三给李四转账

  1. 首先创建一个数据表用于存储张三与李四的相关信息
create table account(
id int primary key auto_increment,
accountName varcahr(40),
money double);
  1. 存入张三与李四的数据
insert into account(accountName,money) values("张三",500);
insert into account(accountName,money) values("李四",510);
  1. 查看


    JDBC加强_第1张图片
    image.png
  2. 代码部分
  • 未使用事物回滚操作
package demo2;
import util.DBConn;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class AccountDemo {
    private static Connection conn = null;
    private static PreparedStatement stmt = null;

    public static void main(String[] args) {
        String sql_zs = "update account set money=money-500 where accountName='张三'";
        String sql_ls = "update account set money=money+500 where accountName='李四'";

        try {
            conn = DBConn.getConn();
            conn.setAutoCommit(true);   //将事物设置为自动提交
            stmt = conn.prepareStatement(sql_zs);
            stmt.executeUpdate();

            stmt = conn.prepareStatement(sql_ls);
            stmt.executeUpdate();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

问题:当张三这条sql语句执行成功,而李四这条sql语句却没执行成功时,在数据库中则会显示张三的钱变少了,而李四的钱却没有增加,这在现实中是一个很严重的问题.

  • 使用事物回滚操作
    其中只要有一条sql语句执行不成功,另一条也不会生效
package demo2;
import util.DBConn;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class AccountDemo2 {
    private static Connection conn = null;
    private static PreparedStatement stmt = null;

    public static void main(String[] args) {
        String sql_zs = "update account set money=money-500 where accountName='张三'";
        String sql_ls = "update account set money=money+500 where accountName='李四'";

        try {
            conn = DBConn.getConn();
            conn.setAutoCommit(false);   //将事物设置为手动提交
            stmt = conn.prepareStatement(sql_zs);
            stmt.executeUpdate();

            stmt = conn.prepareStatement(sql_ls);
            stmt.executeUpdate();
        } catch (Exception e) {
            try {
                //出现异常,需要回滚事物
                conn.rollback();
            } catch (SQLException e1) {
                e1.printStackTrace();
            }
            e.printStackTrace();
        }finally {
            try {
                //所有操作执行成功,提交事物
                conn.commit();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

你可能感兴趣的:(JDBC加强)