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

posted @ 2019-12-24 22:29  __lay  阅读(792)  评论(0编辑  收藏  举报