kingbase v8r6 事务与并发控制

本文详细阐述了数据库事务的特性(原子性、一致性、隔离性、持久性),事务操作如begin、commit、rollback等,以及事务隔离级别的管理。还介绍了并发控制中的锁机制、MVCC和死锁,以及数据清理工具如vacuum和old_snapshot_threshold的设置。
摘要由CSDN通过智能技术生成

事务,是在数据库中完成一个完整的业务逻辑,由一个或多个sql组成
\set  查看事务的操作行为 查看自动提交状态

1.事务的基本属性:ACID
A原子性,要么全部执行,要么全部都不执行
C一致性,从一个一致状态到另一个一致状态
I隔离性,双个事务之前互不影响
D持久性,事务提交后,数据的影响是永久的

事务的基本行为
commit 提交
rollback  回滚

2.事务操作
\h begin 查看帮助信息
begin开始一个事务,将之后的所有语句在一个事务中执行,直到显示commit/end或rollback/abort
savepiint 事务保存点
rollback to 回退到保存点
isolation level 选择事务隔离级别
read write 事务数据可读写
read only只读事务

3.事务内处理错误
3.1 保存点
事务结束后,原事务中的保存点将被释放,无法继续使用,
3.2 DDL事务
可以将DDL封装到事务中进行操作
注意:不是所有DDL都可以封装,如database,tablespace等操作
3.3 只读事务  设置事务模式
set transaction read only 只读事务
在只读事务中,不允许在事务中进行DML操作

4. 了解锁定
不同会话的事务交叉进行时,如修改同一张表的不同数据,则事务之间不会阻塞
如修改同一张表的相同数据,则事务之间会排队并产生阻塞等待。
4.1 避免典型错误和显示锁定
\h lock 查看帮助信息
access share 只读共享锁
row share 行共享 与exclusive和access exclusive冲突
row exclusive 行唯一
share 用于create index语句,防止并发修改
access exclusive 强排他锁
4.2 使用for update和for share
通过for update及相关属性,可将select获取的数据进行行加锁
for share 允许多个事务在同一时刻都持有该类型的锁

准备数据 插入指定行数据 generate_series函数
create table big1(id int,mark boolean);
insert into big1 select generate_series(1,10),'true';


5 事务的隔离级别
默认事务隔离模式;读已提交
隔离级别:
read uncommitted, 读未提交
read committed, 读已提交  默认级别
repeatable read 可重复读
serializable 可序列化  解决幻读问题
5.1 查看事务的隔离级别
show default_transaction_isolation;
select name,setting from sys_settings where name = 'default_transaction_isolation'
select current_setting('default_transaction_isolation')

5.2 修改全局的事务隔离级别
参数文件kingbase.conf
cat kingbase.conf |grep -i default_transaction_isolation

alter system set default_transaction_isolation = 'read committed'
查看
show default_transaction_isolation;

让修改生效 参数生效
select sys_reload_conf();
或;
show default_transaction_isolation;
alter system set default_transaction_isolation='read committed'
启用参数配置
sys_ctl reload -D /xx/xx/data

5.3 设置当前会话的事务隔离级别
show default_transaction_isolation;
set session characteristics as transaction isolation level repeatable read;
\h transaction 命令帮助信息


二 并发控制
1.锁与并发
1.1 并行查询相关参数
select name,setting from sys_settings where name like 'm%work%' or
name like '%parallel%' order by 1;
参数
force_parallel_mode 强制开启并行,不建议开启
max_worker_processes 设置系统支持最大后台进行数,默认8
max_parallel_workers_per_gather 允许开启的并行进程的进程数,默认2

1.2 死锁与咨询锁
死锁是数据库中两个/多个事务相互交叉等待造成。
咨询锁,就是找个数字进行加锁,与表中的数据无关
1.3 基于锁的并发控制
排它锁,共享锁
意向锁,多粒度封锁机制要检查某对象是否有锁。
1.3.1 支持事务的DDL
truncate操作会影响对象OID与数据文件之间关联性
1.4 基于多版本的并发控制
基于多个旧值版本的并发控制即MVCC
一般把基于锁的并发控制机制称为悲观机制,基于MVCC机制称为乐观机制。
1.4.2 MVCC优点
会话的事务隔离避免给过多的资源加锁而导致其他客户端不能执行操作
运行查询和数据读取时的锁与数据库写时的锁不会冲突
数据读取和写入不会阻塞
并发操作时可以不用对表或行产生锁竞争
用户/应用依然可以使用lock或for update/share
MVCC缺点
事务xid有个数限制,需要对数据 dead数据进行适当清理,
大量过期/不可见的数据占用磁盘空间,降低了查询性能,需要适当的维护

获取事务id,事务关联的后台进程id
select txid_current(),sys_backend_pid();

vacuum实现
有两种主要的内部结构用于数据清理的输入和输出操作
vacuum table_name;  清表,没有释放表空间
select sys_size_pretty(sys_relation_size('table_name')) 查看表大小
vacuum full 收回空间

1.5 snapshot too old 快照过旧
可通过设置数据库的old_snapshot_threshold,将超时的历史数据进行清理回收
show old_snapshot_threshold;
select name,setting,context from sys_settings where name='old_snapshot_threshold';
默认值-1表示禁用该功能,取值范围1min-60天

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值