KingbaseES 串行化隔离级别引起的阻塞分析
前言
这是实际生产环境中遇到的一个问题,前端业务有如下报错:
could not serialize access due to read/write dependencies among transactions
Detail: Reason code: Canceled on coinflict out to pivot as a pivot 27892139, during read.
串行化隔离级别的含义
可串行化隔离级别保证了数据库中事务是按照顺序串行执行,而非并行。数据库可以防止所有可能的竞争条件。
串行化隔离级别可能会遇到的阻塞情况
创建测试数据
create table idx (id int,ci character varying );
create index on idx(id);
insert into idx select generate_series(1,10000);
TEST=# insert into idx select generate_series(1,10000);
INSERT 0 10000
修改 KINGBASE.CONF中
default_transaction_isolation = 'SERIALIZABLE'
重启数据库
1.Read触发报错,事务执行时间顺序如下表:
| 时间点 | T1 | T2 | T3 |
|---|---|---|---|
| t1 | begin; | ||
| t2 | select * from idx where id = 1; | ||
| t3 | begin; | ||
| t4 | update idx set ci='x' where id =1; | ||
| t5 | begin; | ||
| t6 | update idx set ci='x' where id=1000; | ||
| t7 | commit; | ||
| t8 | select * from idx where id = 1000; |
T2在执行select时候有如下报错
TEST=# select * from idx where id = 1000;
ERROR: could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on conflict out to pivot 1771, during read.
HINT: The transaction might succeed if retried.
报错原因是T2事务在t4时间点还没结束,然后开启T3事务,而当T3事务结束以后,T2事务再执行select查询就违反了串行隔离级别的定义。
当一个事务处于可串行化级别, 一个select查询只能看到在事务开始之前提交的数据而永远看不到未提交的数据或事务执行中其他并行事务提交的修改。
2.Write触发报错,事务执行时间顺序如下表:
| 时间点 | T1 | T2 | T3 |
|---|---|---|---|
| t1 | begin; | ||
| t2 | select * from idx where id = 1; | ||
| t3 | begin; | ||
| t4 | select * from idx where id = 1000; | ||
| t5 | begin; | ||
| t6 | update idx set ci='x' where id =1000; | ||
| t7 | commit; | ||
| t8 | update idx set ci ='x' where id =1; |
T2在执行update时候有如下报错
TEST=# update idx set ci ='x' where id =1;
ERROR: could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on identification as a pivot, during write.
HINT: The transaction might succeed if retried.
从表格的时间线我们可以看出,对于serialize串行隔离级别,我们必须老老实实一个个事务按顺序进行,如不然就会出现如上报错。
3.Commit触发报错,事务执行时间顺序如下表:
| 时间点 | T1 | T2 |
|---|---|---|
| t1 | begin; | |
| t2 | select * from idx where id =1; | |
| t3 | update idx set ci = 'x' where id =1000; | |
| t4 | begin; | |
| t5 | select * from idx where id = 1000; | |
| t6 | update idx set ci ='x' where id =1; | |
| t7 | commit; | |
| t8 | commit; |
T1在执行commit时候有如下报错
TEST=# commit;
ERROR: could not serialize access due to read/write dependencies among transactions
DETAIL: Reason code: Canceled on identification as a pivot, during commit attempt.
HINT: The transaction might succeed if retried.
总结
一个可串行化的事务在可串行化事务开始之后不能更改被其他事务更改过的行。
当应用收到这样的错误信息时,它应该退出当前的事务然后从头开始进行整个事务。请注意只有更新事务才需要报错重试,只读事务从来没有串行化冲突。
可串行化事务隔离级别必须保证每个事务都看到一个完整的数据库的视图。如果并行更新令数据库不能维持串行执行的样子,那么应用必须准备重试事务。
KingbaseES 串行化隔离级别引起的阻塞分析的更多相关文章
- 关于ORACLE的串行化隔离级别--来自ORACLE概念手册
为了描述同时执行的多个事务如何实现数据一致性,数据库研究人员定义了被 称为串行化处理(serializability)的事务隔离模型(transaction isolation model).当所有 ...
- Oracle 6 - 锁和闩 - transaction的可串行化
本文主要内容 1.transaction的可串行化 2.数据库并发带来的问题, dirty read, Nonrepeatable reads, Phantoms幻读 3.隔离级别和2中的问题 4. ...
- 【Java EE 学习 72 下】【数据采集系统第四天】【移动/复制页分析】【使用串行化技术实现深度复制】
一.移动.复制页的逻辑实现 移动.复制页的功能是在设计调查页面的时候需要实现的功能.规则是如果在同一个调查中的话就是移动,如果是在不同调查中的就是复制. 无论是移动还是复制,都需要注意一个问题,那就是 ...
- PHP面向对象04_串行化
oop04复习 2014-9-3 10:48:45 要点: --1.克隆对象 --2.__toString( ) --3. __call( ) --4.自动加载类 --5.对象串行化 1.克隆对象以及 ...
- 【PHP面向对象(OOP)编程入门教程】22.把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...
- VC++ chap13 文档与串行化
Lesson 13 文档与串行化 13.1使用CArchive类对文件进行读写操作 //让对象数据持久性的过程称之为串行化,或者序列化 void CGraphicView::OnFileWrite() ...
- Java 对象的串行化(Serialization)
1.什么是串行化 对象的寿命通常随着生成该对象的程序的终止而终止.有时候,可能需要将对象的状态保存下来,在需要时再将对象恢复.我们把对象的这种能记录自己的状态以便将来再生的能力.叫作对象的持续性(pe ...
- 【性能诊断】四、单功能场景的性能分析(RedGate,找到同一个客户端的并发请求被串行化问题)
问题描述: 客户端js连续发起两个异步http请求,请求地址相同,但参数不同:POST http://*.*.*.*/*****/webservice/RESTFulWebService/RESTFu ...
- PHP面向对象(OOP):把对象串行化serialize()方法,__sleep()方法,__wakeup()方法
有时候需要把一个对象在网络上传输,为了方便传输,可以把整个对象转化为二进制串,等到达另一端时,再还原为原来的对象,这个过程称之为串行化(也叫序列化), 就像我们现在想把一辆汽车通过轮船运到美国去,因为 ...
- php中对象的串行化
我们大家有知道PHP串行化可以把变量包括对象,转化成连续bytes数据,你可以将串行化后的变量存在一个文件里或在网络上传输,然后再反串行化还原为原来的数据.文章这里就PHP串行化为大家详细的介绍.你在 ...
随机推荐
- Java设计模式-外观模式Facade
介绍 外观模式(Facade),也叫"过程模式:外观模式为子系统中的一组接口提供一个一致的界面,此模式定义了一个高层接口,这个接口使得这一子系统更加容易使用 外观模式通过定义一个一致的接口, ...
- Python之密码生成器
介绍 这段程序用来随机批量生成一批安全性相对较高的密码,要了解你当前使用的密码强度到底如何? 可以试一下这个网站: https://howsecureismypassword.net/ 他会告诉你计算 ...
- c++STL用法总结
一.vector的用法 vector<int> vet; 1.排序:sort(vet.begin(), vet.end()), 时间复杂度O(nlogn) 2.查找:if(find(vet ...
- 从零开始写 Docker(一)---实现 mydocker run 命令
本文为从零开始写 Docker 系列第一篇,主要实现 mydocker run 命令,构造了一个具有基本的 Namespace 隔离的简单容器. 如果你对云原生技术充满好奇,想要深入了解更多相关的文章 ...
- 骚操作之 持有 ReadOnlySpan 数据
ReadOnlySpan<T> 可以说现在高性能操作的重要基石 其原理有兴趣的同学可以看 2018 的介绍Span<T>文章 其为了保障大家安全使用做了相应的限制 那么有没方法 ...
- 5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python
5分钟教你从爬虫到数据处理到图形化一个界面实现山西理科分数查学校-Python 引言 在高考结束后,学生们面临的一大挑战是如何根据自己的分数找到合适的大学.这是一个挑战性的任务,因为它涉及大量的数据和 ...
- 2023 年值得一读的技术文章 | NebulaGraph 技术社区
在之前的产品篇,我们了解到了 NebulaGraph 内核及周边工具在 2023 年经历了什么样的变化.伴随着这些特性的变更和上线,在[文章]博客分类中,一篇篇的博文记录下了这些功能背后的设计思考和研 ...
- C++11新特性的一些用法举例①
//字符串字面量/*常用:1.原始字符串字面量 --- 括号内保持原样输出 --- 没有转义字符,如\n不再是换行,而是直接输出字面量\nR"(str)"; 实例: R" ...
- [爬坑] termux ssh 设置总是 permission denied
问题 设置ssh之后,客户端登录会提示 permission denied 的问题,经过排查最终确定是 shell设置错误的问题,解决方法如下 http://new.aidlearning.net/d ...
- 使用内网nginx代理rancher
需求: rancher 部署在 192.168.188.167服务器上 控制台访问地址 https://192.168.188.167:8443 在本地只有192.168.80.111有权限访问, 需 ...