JDBC的事务处理

时间:2021-05-17 06:19:47

事务,也是数据库事务,指的是作为单个逻辑工作单元执行的一系列操作。正常的情况下,操作应该顺利进行,与操作相关的所有数据库信息也成功地更新;

但是,如果在这一系列过程中任何一个环节出了差错,导致操作失败了,数据库中所有信息都必须保持操作前的状态不变。否则,数据库的信息将会一片混乱而不可预测。

一个逻辑工作单元要称为事务,必须满足ACID(原子性,一致性,隔离性和持久性)。

事务的结束只能有两种形式:提交和回滚。操作完全成功则提交,产生永久性的修改;操作不完全成功则回滚,恢复到事务开始前的状态。它们将结束一个事务。

(1)关闭自动提交事务。通过设置连接的自动提交事务属性为false,如下:

Connection conn = DriverManager.getConnection("连接URL", "用户名", "密码");
//关闭自动提交事务
conn.setAutoCommit(false);

(2)如果执行顺利,提交事务;一旦发生异常,回滚(rollback)事务,如下:

try{
conn.setAutoCommit(false); //关闭自动提交事务
stmt = conn.createStatement(); //创建会话
stmt.executeUpdate("sql语句");
conn.commit(); //提交事务
}catch(Exception e)
{
e.printStackTrace();
conn.rollback(); //回滚事务
}

(3)关闭连接,如下:

finally{
if(stmt != null)
stmt.close();
if(conn != null)
conn.close();
}

延伸:

使用JDBC操作数据库的时候,可以维护一个数据库工具类和有关数据库配置的属性文件,如下:

DBUtil.java

package com.lmb.util;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.ResourceBundle;
import org.apache.commons.dbcp.BasicDataSource;
/**
* 数据库工具类
* @param DRIVER_CLASS type:String 数据库驱动类
* @param URL type:String 要连接的数据库的URL
* @param USER_NAME type:String 要连接的数据库的登录名
* @param PASSWORD type:String 要连接的数据库的密码
* @param PAGE_SIZE type:int 商品分页操作时每页的最大商品数
* @param bds type:BasicDataSource 数据库连接池对象
* @author lmb
*/

public class DBUtil {

public static final String DRIVER_CLASS;
public static final String URL;
public static final String USER_NAME;
public static final String PASSWORD;
public static final int PAGE_SIZE = 12;
private static BasicDataSource bds = new BasicDataSource();

static {
//读取数据库配置资源属性文件,得到数据库配置属性
ResourceBundle rb = ResourceBundle
.getBundle("com.lmb.util.dbconfig");//dbconfig.properties文件的目录
DRIVER_CLASS = rb.getString("DRIVER_CLASS");
URL = rb.getString("URL");
PASSWORD = rb.getString("PASSWORD");
USER_NAME = rb.getString("USER_NAME");
//将从资源属性文件中得到的数据库配置属性,传入新建的数据库连接池对象bds中去
bds.setDriverClassName(DRIVER_CLASS);
bds.setUrl(URL);
bds.setUsername(USER_NAME);
bds.setPassword(PASSWORD);
//设置数据库连接池的初始化连接数
bds.setInitialSize(100);
//设置数据库连接池的最小连接数
bds.setMinIdle(20);
//设置数据库连接池的最大连接数
bds.setMaxActive(150);
}

/**
* 使用数据库连接池来创建数据库连接
* @return connection 一个数据库连接
*/

public static Connection getConnection() {
Connection connection = null;
try {
connection = bds.getConnection();
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}

dbconfig.properties(以mysql为例)

#
DRIVER_CLASS=com.mysql.jdbc.Driver
URL=jdbc\:mysql\://localhost\:3306/hollycrm

USER_NAME=root
PASSWORD=root

当需要创建数据库连接时:

……
Connection conn
=(Connection) DBUtil.getConnection();
……