• 金仓数据库KingbaseES客户端编程接口指南-JDBC(7. JDBC事务处理)


    7. JDBC事务处理

    7.1. 事务的提交与回滚

    应用程序创建一个连接时,该连接默认事务自动提交,用户可以在 Connection 对象中设置事务提交模式(分为自动提交和非自动提交两种),方法如下:

    Connection.setAutoCommit(boolean autoCommit);
    

    当 autoCommit 为 true 时,表示为自动提交模式,这种情况下,该连接下的所有语句在执行完之后都会自动提交。

    在非自动提交模式下,用户在一个事务执行完成之后需要显式调用 Connection.commit 方法来提交事务。方法如下:

    conn.commit();
    

    否则,当该事务需要回滚时,则需要显式调用 Connection.rollback 方法。

    conn.rollback();
    

    为了对事务进行更细级别上的控制,JDBC 3.0 增加了 Savepoint 接口,它代表一个逻辑事务点,在设置为非自动提交模式下,可以设置多个 Savepoint,在回滚的时候可以回滚到指定的 Savepoint,但从事务开始到 Savepoint 之间的操作仍保留。将事务回滚到 Savepoint 时,在该 Savepoint 之后所作的全部更改都将被撤消。 下面的例子说明了 Savepoint 的使用方法。

    例 7-1. Savepoint的使用方法

    过程描述:向表中插入一条记录,设置 savepoint svpt1,插入第二条记录,回滚事务到 svpt1,当提交事务后,第二条记录被取消,第一条被插入。

    Connection connection = DriverManager.getConnection(url, "system",
        "manager");
    connection.setAutoCommit(false);
    
    Statement stmt = connection.createStatement();
    int row1 = stmt.executeUpdate(
        "INSERT INTO transaction (number) VALUES(1)");
    
    /* 设置命名的 Savepoint */
    Savepoint svpt1 = connection.setSavepoint("SAVEPOINT_1");
    int row2 = stmt.executeUpdate(
        "INSERT INTO transaction (number) VALUES(2)");
    
    /* 回滚到 svpt1 */
    connection.rollback(svpt1);
    connection.commit();
    

    对于未命名 Savepoint 对象,可以通过 getSavepointId() 获取此 Savepoint 对象表示的保存点的 ID。

    对于命名 Savepoint 对象,可以通过 getSavepointName() 获取此 Savepoint 对象表示的保存点的名称。

    7.2. JDBC事务的隔离级别

    KingbaseES 的JDBC驱动支持四种事务隔离级别:TRANSACTION_READ_COMMITTED 、TRANSACTION_READ_UNCOMMITTED 、TRANSACTION_REPEATABLE_READ和 TRANSACTION_SERIALIZABLE,默认的事务隔离级别为 TRANSACTION_READ_COMMITTED。

    • TRANSACTION_READ_UNCOMMITTED:

      读未提交,如果一个事务已经开始写数据,则另一个事务不允许同时进行写操作, 但允许其它事务读此行数据。该隔离级别避免了更新丢失,但可能出现脏读,也就是事务B读取到事务A未提交的数据。

    • TRANSACTION_READ_COMMITTED:

      读已提交,如果是一个读事务,则允许其它事务读写,如果是写事务,则会禁止其它事务访问该行数据。 该隔离级别避免了脏读,但可能出现不可重复读。事务A事先读取了数据,然后事务B更新了数据并提交了事务,而事务A再次读取该数据时, 数据已经发生了改变。

    • TRANSACTION_REPEATABLE_READ:

      可重复读,在一个事务内,多次读取同一个数据,在这个事务还没结束时,其它事务不能访问该数据,这样在同一个事务内两次读到的数据是一样的。 读事务将会禁止其它写事务,但允许其它读事务;写事务则禁止了其它任何事务,包括读写,这样避免了不可重复读和脏读,

    • TRANSACTION_SERIALIZABLE

      可序列化,提供严格的事务隔离,要求事务序列化执行。事务只能一个接一个地执行,不能并发执行。 这是最高的事务隔离级别,但是性能是最低的。在该级别下,事务的顺序执行可以避免脏读、不可重复读和幻读。

    用户可以通过 Connection.setTransactionIsolation 来指定事务隔离级别,通过 Connection.getTransactionIsolation 来读取当前事务隔离级别。

    注意

    目前,在KingbaseES 数据库中设置 TRANSACTION_READ_UNCOMMITTED 隔离级别时,实际生效的是 TRANSACTION_READ_COMMITTED 隔离级别。 具体的事务隔离级别描述请参见 《KingbaseES数据库概念》 手册中的 "事务的隔离级别" 章节。

    例 7-2. 事务隔离级别设置和获取

    Connection connection = DriverManager.getConnection(url, "system",
        "manager");
    
    /* 设置隔离级别为:TRANSACTION_READ_UNCOMMITTED */
    connection.setTransactionIsolation(
        Connection.TRANSACTION_READ_UNCOMMITTED);
    
    /* 获得隔离级别 */
    connection.getTransactionIsolation();
    

    7.3. JDBC Savepoint API

    1. public int getSavepointId()

      功能:

      获取此 Savepoint 对象表示的保存点的生成 ID。

      返回值:

      此保存点的数字 ID。

    2. public String getSavepointName()

      功能:

      获取此 Savepoint 对象表示的保存点的名称。

      返回值:

      此保存点的名称。

  • 相关阅读:
    【毕设必备】手把手带你用Python搭建一个简单的后端服务- API的创建,前后端交互的数据传递,GET,POST,JSON,FLASK
    snownlp情感分析
    VS Code 和 Python:数据科学的天作之合
    MybatisX插件 逆向工程
    Django多条件筛选查询
    css 计算函数属性:calc() 不起效 原因
    浅谈前端自定义VectorGrid矢量瓦片样式
    当被问到你使用过iframe吗?有哪些优点和缺点?
    【java学习—九】模板方法(TemplateMethod)设计模式(4)
    内网渗透技巧
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126139101