二、jdbc的关于事务的接口设计

所有文章

https://www.cnblogs.com/lay2017/p/12078232.html

正文

jdbc是jdk设计的一套操作数据库的API,全称是java database connectivity。开发者只需要面对统一的API接口,至于数据库服务的提供商则提供实现jdbc的连接器。开发者想要连接mysql,那么就引入mysql的连接器。想要oracle就引入oracle的连接器。jdbc很好地通过面向接口开发地方式将二者进行分离。

本文将简单提及一下jdbc的API中关于事务方面地接口。jdbc的事务提交分为自动提交、手动提交两种模式,默认自动提交模式。

事务自动提交

以下代码是我们比较熟悉的一个简单的jdbc操作调用,可以看到,这里面几乎没有任何关于事务的代码。

这是因为jdbc默认是事务自动提交的,每当创建一个新的Connection连接,这个Connection默认就会处于auto-commit的模式。

这个Connection,每执行一次sql,就会自动地提交一次事务。所以,一次sql执行对应一个事务。

如果是DDL或者是DML的update、insert、delete操作,当sql执行完毕的时候就会自动提交。而,如果是select语句,那么当ResultSet被close的时候就会提交事务。

public static void autoCommit() throws SQLException {
    // 根据URL,从Driver中获取Connection
    Connection connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
    PreparedStatement statement = null;
    try {
        // 创建statement
        statement = connection.prepareStatement("update t_user SET name = ‘lay‘ WHERE id = 1");
        // 执行statement
        statement.execute();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (statement != null) {
            statement.close();
        }
        if (connection != null) {
            connection.close();
        }
    }
}

事务的手动提交

自动提交的模式很方便,不需要开发者关注任何事务方面的代码。但是有时候我们希望能够手动控制事务的commit或者rollback,亦或者我们希望多条语句作为一个事务提交,而不是默认的一条语句一个事务。

要做到手动提交,首先得关闭Connection的autoCommit模式,通过setAutoCommit(false)来设置。

当处于手动提交的模式,就得注意成功的时候调用connection.commit()提交事务,异常的时候connection.rollback()回滚事务。这属于典型的搭配使用规范。

commit操作将会把当前事务中sql对数据的所有修改全部持久化到数据库中,同时释放所有事务中持有的锁。

rollback操作将会撤销当前事务中所有数据的修改,同时释放所有事务中持有的锁。

两者当且仅当autoCommit=false的时候使用。

public static void manualCommit() throws SQLException {
    // 根据URL,从Driver中获取Connection
    Connection connection = DriverManager.getConnection(URL, USER_NAME, PASSWORD);
    // 设置自动提交为false
    connection.setAutoCommit(false);
    PreparedStatement statement = null;
    try {
        // 创建statement
        statement = connection.prepareStatement("update t_user SET name = ‘lay‘ WHERE id = 1");
        // 执行statement
        statement.execute();
        // 手动提交
        connection.commit();
    } catch (Exception e) {
        // 手动回滚
        connection.rollback();
    } finally {
        if (statement != null) {
            statement.close();
        }
        if (connection != null) {
            connection.close();
        }
    }
}

总结

jdbc对事务的接口设计非常地干净基本上就是一个auto-commit的开关,我们也可以通过getAutoCommit()常看当前Connection是否是事务自动提交模式。如果需要手动控制事务,commit和rollback接口可以提交帮助。

还有一个点需要注意的是Connection的close方法也和事务有点关系。当调用了close方法时,如果当前存在未关闭的事务,事务是否在close的时候做提交需要根据不同数据库连接器的实现来判断。

原文地址:https://www.cnblogs.com/lay2017/p/12093938.html

时间: 2024-10-10 18:03:23

二、jdbc的关于事务的接口设计的相关文章

Java数据库连接——JDBC调用存储过程,事务管理和高级应用

阅读目录 一.JDBC常用的API深入详解及存储过程的调用1.存储过程(Stored Procedure)的介绍2.JDBC调用无参存储过程3.JDBC调用含输入参数存储过程4.JDBC调用含输出参数存储过程二.JDBC的事务管理1.JDBC实现事务管理2.通过代码实现事物的管理三.数据库连接池(dbcp.c3p0)1.dbcp使用步骤2.c3p0使用步骤3.连接池总结四.JDBC的替代产品(Hibernate.Mybatis)1.Commons-dbutils 2.Hibernate简介3.M

javaweb学习总结(三十二)——JDBC学习入门【转】

原文地址:javaweb学习总结(三十二)——JDBC学习入门 一.JDBC相关概念介绍 1.1.数据库驱动 这里的驱动的概念和平时听到的那种驱动的概念是一样的,比如平时购买的声卡,网卡直接插到计算机上面是不能用的,必须要安装相应的驱动程序之后 才能够使用声卡和网卡,同样道理,我们安装好数据库之后,我们的应用程序也是不能直接使用数据库的,必须要通过相应的数据库驱动程序,通过驱动程序去和数 据库打交道,如下所示: 1.2.JDBC介绍 SUN公司为了简化.统一对数据库的操作,定义了一套Java操作

JDBC&&c3p0、事务、批处理、多线程 于一体的经典秘方QueryRunner (common-dbutils)

目录: 基础篇_功能各自回顾 JDBC基础代码回顾(使用JdbcUtils工具简化) c3p0数据库连接池的使用(使用JdbcUtils工具简化) 大数据的插入(使用c3p0+JdbcUtils工具简化) 批处理操作(使用c3p0+JdbcUtils工具简化) 数据库中的事务处理(使用c3p0+JdbcUtils工具简化) 多线程的并发控制 进阶篇_迈向标准开发        自己编写dbutils工具( QueryRunner .TxQueryRunner和JdbcUtils)   (本文核心

【Spring实战】—— 16 基于JDBC持久化的事务管理

前面讲解了基于JDBC驱动的Spring的持久化管理,本篇开始则着重介绍下与事务相关的操作. 通过本文你可以了解到: 1 Spring 事务管理的机制 2 基于JDBC持久化的事务管理 首先看一下Spring的事务管理的机制 Spring本身并不提供事务管理,它只是把事务管理提交给事务管理器,而事务管理器则有多种实现,常见的就是基于JDBC的.Hibernate的.JPA以及JTA的. 操作流程可以参考下面的图片: 其实还有好多种类的事务管理器,这里就不一一列举了. 下面看一下在基于JDBC持久

2.35 Java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别

java基础总结①抽象②接口③设计抽象类和接口的原则④接口和抽象类的区别 一.抽象 abstract作用:不能产生对象,充当父类,强制子类正确实现重写方法和类相比仅有的改变是不能产生对象,其他的都有,包括构造.属性等等任何一个类只要有一个抽象的方法就成了抽象类 抽象方法 public abstract A();①方法是抽象的,这个类也是抽象的:②子类必须重写抽象方法,除非子类也是抽象类 抽象类可以没有抽象方法,但一般不这么设计 二.接口 interface 接口也是Java的一种引用数据类型(J

php后台对接ios,安卓,API接口设计和实践完全攻略,涨薪必备技能

2016年12月29日13:45:27 关于接口设计要说的东西很多,可能写一个系列都可以,vsd图都得画很多张,但是由于个人时间和精力有限,所有有些东西后面再补充 说道接口设计第一反应就是restful api 请明白一点,这个只是设计指导思想,也就是设计风格 ,比如你需要遵循这些原则 原则条件REST 指的是一组架构约束条件和原则.满足这些约束条件和原则的应用程序或设计就是 RESTful.Web 应用程序最重要的 REST 原则是,客户端和服务器之间的交互在请求之间是无状态的.从客户端到服务

蓝牙(BLE)应用框架接口设计和应用开发——以TI CC2541为例

本文从功能需求的角度分析一般蓝牙BLE单芯片的应用框架(SDK Framework)的接口设计过程,并以TI CC2541为例说明BLE的应用开发方法. 一.应用框架(Framework) 我们熟知的Framework包括Android Framework.Linux QT.Windows MFC.应用框架抽象并封装实现了一般应用场景的需求,完成应用开发的80%,剩下的20%则以回调(callback)和接口的方式供应用开发人员调用以完成具体的需求. 一般Framework完成的工作包括:任务分

Spring事务管理接口PlatformTransactionManager的实现类DataSourceTransactionManager

package org.springframework.jdbc.datasource; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.springframework.beans.factory.InitializingBean; import org.springfra

C++ 11可变参数接口设计在模板编程中应用的一点点总结

概述 本人对模板编程的应用并非很深,若要用一句话总结我个人对模板编程的理解,我想说的是:模板编程是对类定义的弱化. 如何理解“类定义的弱化”? 一个完整的类有如下几部分组成: 类的名称: 类的成员变量(或属性,C#中属性和成员变量还是有区别的): 类的成员方法: 从编译器的角度看,我们必须明确指定以上3部分,才算完整地定义了一个类并且编译通过. 所谓的“类弱化”,是指类的设计者在定义类的时候,并没有完整定义一个类,而是把类的其中一部分的定义留给类的使用者. 从传统才c++98看,通过模板类,使用