当前位置:网站首页>金仓数据库KingbaseES客户端编程接口指南-JDBC(7. JDBC事务处理)
金仓数据库KingbaseES客户端编程接口指南-JDBC(7. JDBC事务处理)
2022-08-04 07:22:00 【沉舟侧畔千帆过_】
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
public int getSavepointId()
功能:
获取此 Savepoint 对象表示的保存点的生成 ID。
返回值:
此保存点的数字 ID。
public String getSavepointName()
功能:
获取此 Savepoint 对象表示的保存点的名称。
返回值:
此保存点的名称。
边栏推荐
猜你喜欢
随机推荐
安装GBase 8c数据库的时候,报错显示“Resource:gbase8c already in use”,这怎么处理呢?
TCP协议详解
25.时间序列预测实战
CSDN21天学习挑战赛——day1 正则表达式大总结
Typora_Markdown_图片标题(题注)
The national vocational skills contest competition of network security emergency response
小程序如何使用订阅消息(PHP代码+小程序js代码)
串口监听 - 软件方案
MYSQL JDBC图书管理系统
虚拟机没有USB网卡选项怎么解决
likeshop外卖点餐系统【100%开源无加密】
有人试过用NPGsql驱动连接openGauss开发应用的吗?
中断和异常的处理与抢占式多任务
小猫爪:AWR294x学习笔记02-AWR294x之DPM&IPC
Typora颜色公式代码大全
MySQL 8.0.29 详细安装(windows zip版)
Cross-species regulatory sequence activity prediction
函数柯里化详解
解决报错: YarnScheduler: Initial job has not accepted any resources
dalle:zero-shot text-to-image generation