jdbc mysql 事务_JDBC事务、简介

JDBC简介

JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC对Java程序员而言是API,对实现与数据库连接的服务提供商而言是接口模型。数据库生产产商都根据接口模型去实现各自的应用驱动,Java程序员只需指定不同的数据库应用驱动,便可根据API对相应数据库发送SQL调用。

常见的JDBC组件

JDBC API提供以下接口和类DriverManager:此类管理数据库驱动程序列表。 使用通信子协议将来自java应用程序的连接请求与适当的数据库驱动程序进行匹配。在JDBC下识别某个子协议的第一个驱动程序将用于建立数据库连接。

Driver:此接口处理与数据库服务器的通信。我们很少会直接与Driver对象进行交互。 但会使用DriverManager对象来管理这种类型的对象。 它还提取与使用Driver对象相关的信息。

Connection:此接口具有用于联系数据库的所有方法。 连接(Connection)对象表示通信上下文,即,与数据库的所有通信仅通过连接对象。

Statement:使用从此接口创建的对象将SQL语句提交到数据库。 除了执行存储过程之外,一些派生接口还接受参数。

ResultSet:在使用Statement对象执行SQL查询后,这些对象保存从数据库检索的数据。 它作为一个迭代器并可移动ResultSet对象查询的数据。

SQLException:此类处理数据库应用程序中发生的任何错误。

JDBC事务

关闭自动提交

如果JDBC连接处于自动提交模式,默认情况下,则每个SQL语句在完成后都会提交到数据库。

要启用手动事务支持,而不是使用JDBC驱动程序默认使用的自动提交模式,请调用Connection对象的setAutoCommit()方法。 如果将布尔的false传递给setAutoCommit(),则关闭自动提交。 也可以传递一个布尔值true来重新打开它。

例如,如果有一个名为conn的Connection对象,请将以下代码关闭自动提交 -

conn.setAutoCommit(false);

提交和回滚

完成更改后,若要提交更改,那么可在连接对象上调用commit()方法,如下所示:

conn.commit( );

否则,要使用连接名为conn的数据库回滚更新,请使用以下代码 -

conn.rollback( );

JDBC设置隔离级别

假定您的数据库和 JDBC 驱动程序支持这个特性,则给定一个 Connection对象,您可以明确地设置想要的事务级别。

JDBC五种事务级别

int TRANSACTION_NONE = 0; // 不支持事务int TRANSACTION_READ_UNCOMMITTED = 1; // 隔离级别为读未提交int TRANSACTION_READ_COMMITTED = 2; // 隔离级别为读已提交int TRANSACTION_REPEATABLE_READ = 4; // 隔离级别为可重复读int TRANSACTION_SERIALIZABLE = 8; // 隔离级别为串行化

MySQL支持4种隔离级别、Oracle支持两种隔离级别。 不同的隔离级别解决不同的并发问题。因为“数据库事务的四大特性以及事务的隔离级别”这篇博客已做笔记,本篇就不再赘述,想了解的可以查看这篇博客。

JDBC查看、设置数据库的事务隔离级别

可以通过下面的方法确定当前事务的级别:

int level = conn.getTransactionIsolation();

可以通过下面的方法设置当前事务的隔离级别

conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

设置当前事务的隔离级别,必须当前项目数据库支持这个隔离级别。不然会报SQLException。比如:给Oracle设置TRANSACTION_REPEATABLE_READ隔离级别,程序就会发生异常。

conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);

// 程序发生SQLExceptionjava.sql.SQLException: 仅 READ_COMMITTED 和 SERIALIZABLE 是有效的事务处理级

JDBC事务保存点

有时候一个事务可能是一组复杂的语句,因此可能想要回滚到事务中某个特殊的点。比如我们有一张日志表Logs,用来记录员工信息保存成功的日志。但是因为它只用于日志记录,当插入日志表有任何异常时,我们不希望回滚整个事务,而是日志异常也提交保存的员工信息。那么可以创建一个JDBC事务保存点。

JDBC Savepoint帮我们在事务中创建检查点(checkpoint),这样就可以回滚到指定点。当事务提交或者整个事务回滚后,为事务产生的任何保存点都会自动释放并变为无效。把事务回滚到一个保存点,会使其他所有保存点自动释放并变为无效。

public class EmployeeJDBCSavePointExample {

public static final String INSERT_LOGS_QUERY = "insert into Logs (message) values (?)";

public static void main(String[] args) {

Connection con = null;

Savepoint savepoint = null;

try {

con = DBConnection.getConnection();

con.setAutoCommit(false);

EmployeeJDBCInsertExample.insertEmployeeData(con, 2, "Pankaj");

EmployeeJDBCInsertExample.insertAddressData(con,

2,

"Albany Dr",

"SFO",

"USA");

savepoint = con.setSavepoint("EmployeeSavePoint");

insertLogData(con, 2);

con.commit();

}

catch (SQLException e) {

e.printStackTrace();

try {

if (savepoint == null) {

con.rollback();

System.out.println("JDBC Transaction rolled back successfully");

} else {

con.rollback(savepoint);

con.commit();

}

}

catch (SQLException e1) {

System.out.println("SQLException in rollback" + e.getMessage());

}

}

catch (ClassNotFoundException e) {

e.printStackTrace();

}

finally {

try {

if (con != null)

con.close();

}

catch (SQLException e) {

e.printStackTrace();

}

}

}

private static void insertLogData(Connection con, int i)

throws SQLException {

PreparedStatement stmt = con.prepareStatement(INSERT_LOGS_QUERY);

stmt.setString(1, "Employee information saved successfully for ID" + i);

stmt.executeUpdate();

System.out.println("Logs Data inserted successfully for ID=" + i);

stmt.close();

}

}

JDBC常用配置信息

MySQL JDBC驱动和数据库URL配置

static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";

static final String DB_URL = "jdbc:mysql://hostname:port/db_name";

// 如需指定国际化参数static final String DB_URL = "jdbc:mysql://hostname:port/db_name?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC";

Oracle JDBC驱动和数据库URL配置

static final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";

static final String DB_URL = "jdbc:oracle:thin:@host:port:SID";

Oracle查询SID语句

select value from v$parameter where name='instance_name';

参考资料:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值