zoukankan      html  css  js  c++  java
  • 二、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的时候做提交需要根据不同数据库连接器的实现来判断。

  • 相关阅读:
    nop调试-区域路由问题
    nop4.3 用户权限管理
    nop4.3 admin中添加新菜单
    nop 中创建任务(Task)
    SignalR 的应用
    mvc和ef如何连接
    .net中微信、支付宝回调
    C# 中使用Aspose.Words下载文档
    添加 Azure Active Directory 服务,调用方法
    Net Core 5.0 部署IIS错误-500.31-Failed to load ASP.NET Core runtime
  • 原文地址:https://www.cnblogs.com/lay2017/p/12093938.html
Copyright © 2011-2022 走看看