当前位置:网站首页>金仓数据库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 对象表示的保存点的名称。
返回值:
此保存点的名称。
边栏推荐
猜你喜欢
【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解
Secondary network security competition C module MS17-010 batch scanning
2022的七夕,奉上7个精美的表白代码,同时教大家改源码快速自用
form表单提交到数据库储存
一天搞定JDBC01:连接数据库并执行sql语句
The national vocational skills contest competition of network security emergency response
卷积神经网络CNN
(19)[系统调用]SSTD hook 阻止关闭
使用腾讯云发送短信 ---- 手把手教你搞定所有步骤
Lightweight Backbone VGNetG Achieves "No Choice, All" Lightweight Backbone Network
随机推荐
1161. Maximum Level Sum of a Binary Tree
高等代数_证明_两个矩阵乘积为0,则两个矩阵的秩之和小于等于n
为什么手动启动GBase 8c数据库中GTM节点,起不来。显示“Run cmd failed:scp: /tmp/gtm_gtm1.server: Permission denied”
RHCSA第五天
【JS 逆向百例】某网站加速乐 Cookie 混淆逆向详解
unity 循环选择器
app逆向1某联
打破千篇一律,DIY属于自己独一无二的商城
此时已莺飞草长,愿世间美好与你环环相扣
高等代数_证明_对称矩阵一定能够相似对角化
【我想要老婆】
中断和异常的处理与抢占式多任务
Distributed Computing MapReduce | Spark Experiment
10个程序员可以接私活的平台和一些建议,赚麻...
一天学会JDBC03:Statement的用法
两日总结六
异常值 识别与处理方法
LeetCode每日五题01:两数之和 (均1200题)
电商系统PC商城模块介绍
Typora颜色公式代码大全