首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

免费开放阅读 | 数据库管理系统事务原理(上)

幻象现象:事务 T1在 t0时刻带有特定条件地读取了row对象数据,事务 T2t1 时刻插入新数据或更新其他旧数据但满足事务T1特定 WHERE 条件,新数据满足与事务 T1同样条件,当事务...说明: 表格头两行,表明写写并发操作引发两种异常现象,分别是脏写、丢失更新。 表格第一,时间,表明时间在逐渐增长,即 t0<t1<t2<t3。...表格第一,时间,表明时间在逐渐增长,即 t0<t1<t2<t3。 对于每一种异常现象,都分为2个,分别是两个并发事务,各自命名为 T1事务和 T2事务。...但是,如表1-9 所示,不可重复读对于事务 T1 读取一个存在的确定一行数据(意味着这行数据是存在数据),这个行数据本身被事务 T2 使用更新或删除操作而改变;而幻象对于事务 T1 读取是满足条件...如表 1-9 所示,不可重复读对于事务 T2 写操作是更新或删除操作,而幻象对于事务 T2 写操作是插入(插入新数据满足条件)或更新(使不满足条件数据在更新后满足条件)操作。

1.6K81
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    mysql8不需要前缀即可走索引?

    ,适用于所有的复合B树索引,包含了唯一索引和非唯一索引 当where语句查询条件不存在索引前导(即前缀),也可以适用该索引 例如:test表中存在b树索引(t1,t2) 正常来说: select...可以看出,它将t2=1分为了t1所有+and t2=1 union all结果,使得它支持了索引 例如,当t1索引存在 1-100时,会使用t1=1,t1=2,t1=3直到100,and t2...该查询仅引用一个表。 查询不使用GROUP BYor DISTINCT。 查询仅引用索引中。 A1, ..., A 上k谓词必须是等式谓词并且它们必须是常量。...C 上必须有范围条件。 D 列上条件是允许。D 上条件必须与 C 上范围条件结合使用。...这里面有个比较重要点,查询时仅能使用索引中,也就是说,不能select * ,只能select 索引+主键 同时,在我测试中,只要是select 索引,不管是5.0还是8.0,都可以走到索引

    42920

    最完整Explain总结,SQL优化不再困难

    key3 = 'a1b6cee57a'; 输出结果中我们可以看到,t1表在外层查询中,外层查询有一个独立SELECT关键字,所以第一条记录id就是1,t2表在子查询中,子查询有一个独立SELECT... SELECT * FROM t2; 结果中可以看到,最左边小查询SELECT * FROM t1对应是执行计划中第一条记录,它select_type就是PRIMARY。...> EXPLAIN SELECT * FROM t1 WHERE key1 IN (SELECT key1 FROM t2); 执行计划第三条记录id为2,说明该条记录对应一个单表查询,...t1访问方法是eq_ref,而对应ref是canal_manager.t2.id,这说明在对被驱动表进行访问时会用到PRIMARY索引,也就是聚簇索引与一个进行等值匹配条件,于t2id... key1 from t1; Using filesort mysql 会对结果使用一个外部索引排序,而不是按索引次序表里读取行。

    61420

    如何使用Excel将某几列有标题显示到新

    如果我们有好几列有内容,而我们希望在新中将有内容标题显示出来,那么我们怎么做呢? Excel - TEXTJOIN function 1....- - - - 4 - - - 在开始,我们曾经使用INDEX + MATCH方式,但是没有成功,一直是N/A https://superuser.com/questions/1300246/if-cell-contains-value-then-column-header...所以我们后来改为TEXTJOIN函数,他可以显示,也可以显示标题,还可以多个列有时候同时显示。...- - 4 - - - 15 Year 5 - - - - 5 - - - =TEXTJOIN(", ",TRUE,IF(ISNUMBER(B2:I2),$B$1:$I$1,"")) 如果是想要显示,...则: =TEXTJOIN(", ",TRUE,IF(ISNUMBER(B2:I2),B2:I2,"")) 其中,ISNUMBER(B2:I2)是判断是不是数字,可以根据情况改成是不是空白ISBLANK

    11.3K40

    MySQL 索引管理与执行计划

    1.1 索引介绍   索引是对数据库表中一或多进行排序一种结构,使用索引可快速访问数据库表中特定信息。...主要通过增加一个字段,存储hash,将hash建立索引,在插入和更新时候,建立触发器,自动添加计算后hash到表里。...第五行:代表union临时表中读取行阶段,table表示用第一个和第四个select结果进行union操作。...1.5.11 ref   表示上述表连接匹配条件,即哪些或常量被用于查找索引列上。...null(但必须在所有 都满足is null时候),或者=一个;   当建立索引第一位置是=一个时,其他索引可以是任何情况(包括is null =一个),以上两种情况索引都会走。

    1.9K00

    Oracle优化05-执行计划

    具体看: Oracle-SQL Explain Plan解读 ---- 如何看懂一个SQL执行计划 首先得到一个SQL执行计划 我们使用select * from table(DBMS_XPLAN.display_cursor...其中,rows 就是我们上面说到 Card(Cardinality) 9i以前版本使用是Card. ---- 如何阅读呢?...大致意思是: T2表读取第一行数据 是否符合条件 如果符合就拿出一行来,然后到索引IND_T1 中找到对应,然后重复,直到把整个T2表全表扫描完,这个过程就叫NESTED LOOPS ....(疑惑待思考) 最后将结果返回: Operation SELECT STATEMENT ---- 执行计划中说明 ID: 是一个序号,注意,它大小并不是执行先后顺序。...filter,表示谓词条件并不会影响数据访问路径,只起到过滤作用。

    78210

    MySQL 索引管理与执行计划

    1.1 索引介绍   索引是对数据库表中一或多进行排序一种结构,使用索引可快速访问数据库表中特定信息。...主要通过增加一个字段,存储hash,将hash建立索引,在插入和更新时候,建立触发器,自动添加计算后hash到表里。...第五行:代表union临时表中读取行阶段,table表示用第一个和第四个select结果进行union操作。...1.5.11 ref   表示上述表连接匹配条件,即哪些或常量被用于查找索引列上。...null(但必须在所有 都满足is null时候),或者=一个;   当建立索引第一位置是=一个时,其他索引可以是任何情况(包括is null =一个),以上两种情况索引都会走。

    81040

    MySQL DQL 连接查询

    假设 t1 表有 i 和 j t2 表有 k 和 j ,那么下面两个 JOIN 查询是等价: SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1...通常,ON 子句用于指定如何连接表条件,而 WHERE 子句则限制结果集中包含哪些行。 USING(join_column_list) 子句指定两个表中都必须存在列表。...如果表 a 和 b 都包含 c1、c2 和 c3,则以下连接分别使用 USING 和 ON 指定连接条件是等价。...但是关于确定为 SELECT * 显示哪些,这两个联接在语义上并不相同。 USING 连接选择相应列合并,而 ON 连接选择所有表中所有。...因此,连接表达式 t1, t2 JOIN t3 被解释为 (t1, (t2 JOIN t3)),而不是 ((t1, t2) JOIN t3)。这会影响 ON 子句,因为该子句只能引用连接表中

    6900

    MySQL语句加锁分析详解

    因为T2已经提交,改动该记录并不会造成阻塞),但是这样一来这条新记录trx_id隐藏就变成了T1事务id,之后T1中再使用普通SELECT语句去查询这条记录时就可以看到这条记录了,也就把这条记录返回给客户端了...为15记录锁,但是如果你先执行T2,再执行T1,由于T2已经持有了number为15记录锁,事务T1将因为获取不到这个锁而等待。...FOR UPDATE加锁情况类似,不过如果被更新中还有别的二级索引的话,对应二级索引记录也会被加锁。 使用DELETE ...来为记录加锁,比方说: 与SELECT ......前边说在使用number <= 8这个条件语句中,需要把number为15记录也加一个锁,之后又判断它不符合边界条件而把锁释放掉。...name为l刘备二级索引记录上X型正经记录锁,而T1中仍然持有name为l刘备二级索引记录上S型正经记录锁,这就造成了T2获取不到锁而进入等待状态。

    1.3K40

    InnoDB MVCC 详解

    这里面的事务为活跃事务,不可见; m_up_limit_id,小于此是已提交事务,可见; m_low_limit_id,大于等于此是未开启事务,不可见; trx_id::id   读写事务都会...例如t1有三个版本数据: 在cluster index中,最新版本记录为T3(1,5,roll_ptr,1,'c')其中5为事务id,数据就在page中;上一个版本为T2(1,3,roll_ptr,1...我们强制使用二级索引i_c3,查询会先从二级索引读取符合条件(c3>=’a’)记录再回cluster index获取完整记录。 ?  ...并且判断二级索引和聚集索引一致(row_sel_sec_rec_is_for_clust_rec),因此可以返回记录(1,1,’a’); ?...如果session2更新条件变化为update t2 set c2=3 where c2=1;那么session2将等待。

    3.4K77

    老司机总结12条 SQL 优化方案(非常实用)

    (NLJ),示例如下: 1.执行语句:select * from t1 straight_join t2 on (t1.a=t2.a);由于被驱动表t2.a是有索引,其执行逻辑如下: t1中读入一行数据...R; 数据行R中,取出a字段到表t2里去查找; 取出表t2中满足条件行,跟R组成一行,作为结果集一部分; 重复执行步骤1到3,直到表t1末尾循环结束。...,会导致索引失效 MySQL 8.0 开始,索引特性增加了函数索引,即可以针对函数计算后建立一个索引,也就是说该索引是函数计算后,所以就可以通过扫描索引来查询数据。...3.存储引擎不能使用索引中范围条件右边。...因此只有一个条件是索引是没有意义,只要有条件不是索引,就会进行全表扫描。

    89930

    MySQL 连接查询

    假设 t1 表有 i 和 j t2 表有 k 和 j ,那么下面两个 JOIN 查询是等价: SELECT * FROM t1 NATURAL JOIN t2; SELECT * FROM t1...通常,ON 子句用于指定如何连接表条件,而 WHERE 子句则限制结果集中包含哪些行。 USING(join_column_list) 子句指定两个表中都必须存在列表。...如果表 a 和 b 都包含 c1、c2 和 c3,则以下连接分别使用 USING 和 ON 指定连接条件是等价。...但是关于确定为 SELECT * 显示哪些,这两个联接在语义上并不相同。 USING 连接选择相应列合并,而 ON 连接选择所有表中所有。...因此,连接表达式 t1, t2 JOIN t3 被解释为 (t1, (t2 JOIN t3)),而不是 ((t1, t2) JOIN t3)。这会影响 ON 子句,因为该子句只能引用连接表中

    31620

    【连载】openGauss SQL 引擎|查询优化

    其中表t1采用是哈希分布方法,其分布键为c1,表t2采用也是哈希分布方法, 其分布键为c2,由于SELECT 查询中选择条件是在t1.c1和t2.c2上做连接操作, 这两个分布不同,因此做连接操作之前需要添加数据重分布来确保连接数据在...例如当一个表中数据频繁更新程度超过了一个阈值,那 么就需要自动更新这个表统计信息。在查询优化过程中,如果优化器发现统计信 息数据已经严重滞后,也可以发起统计信息收集工作。...表级统计信息通常包括元组数量(N)、表占有的页面数(B),而统计信息则主要包括属性宽度(W)、属性最大(Max)、最小(Min)、高频(MCV)等,通常针对每个会建立一个直方图(H...2.选择率 通过统计信息,代价估算系统就可以了解一个表有多少行数据,用了多少个数据页面,某个出现频率等,然后根据这些信息就能计算出一个约束条件(例如 SQL 语句中 WHERE条件)能够过滤掉多少数据...(2)由于连接条件(t1.c1=t2.c2)中与两表分布不同,因此该计划对t2进行了广播(Broadcast),广播算子总代价为15.18,此代价已经包括了顺序扫描t2代价13.13。

    93730

    explain | 索引优化这把绝世好剑,你真的会用吗?

    所以这个列子中表顺序顺序是:test1、t1、 也许你会在这里心生疑问: 是什么鬼? 它表示派生表,别急后面会讲。 还有一个问题:id允许为空吗? 答案在后面揭晓。...:子查询结果,其id为N partitions表示查询将从中匹配记录分区 type表示连接类型,是查看索引执行情况一个重要指标。...我们看到表t1命中索引是const(常量),而t2命中索引是sue库t1id字段。...rows 该列表示MySQL认为执行查询必须检查行数。 对于InnoDB表,此数字是估计,可能并不总是准确。 filtered 该列表示按表条件过滤表行估计百分比。...Extra 该字段包含有关MySQL如何解析查询其他信息,这还是挺重要,但是里面包含太多,就不一一介绍了,只列举几个常见

    1K20

    MySQL读取记录和我想象不一致——事物隔离级别和MVCC

    数据库检查一致性是一个耗费性能工作,比如为表建立一个触发器,每当插入或更新记录时候就会校验是否满足条件,如果涉及到某一些计算,就会严重影响插入或更新速度。   ...数据库不一致状态是不应该暴露给用户。   严格一点解释:假设事务T1T2并发执行,它们都要访问数据项X,T1先修改了X,然后T2又读取了未提交事务T1修改后X,之后T1中止而T2提交。...严格一点解释:假设事务T1T2并发执行,它们都要访问数据项X,T1先读取了X,然后T2又修改了未提交事务T1读取X,之后T2提交,然后T1再次读取数据项X时会得到与第一次读取时不同...,示意图如下:   严格一点解释:假设事务T1T2并发执行,T1先读取符合搜索条件P记录,然后T2写入了符合搜索条件P记录。...思考题: RR隔离级别下事务T1T2并发执行,T1先根据某个搜索条件读取到3条记录,然后事务T2插入一条符合相应搜索条件记录并提交,然后事务T1再根据相同搜索条件执行查询,结果如何

    42510

    【随笔小记】MySQL基础学习

    --更新数据,无条件 update kc set 学分 = 学分+10; --更新数据,带条件 update kc set 学分 = 学分+100 where 课程号 = '101'; 删除数据 --...删除某一条数据 delete from kc where 课程号 = '101'; --多个表中删除行(数据) --假设有三个表,t1t2、t3,他们都含有ID(字段)。...请删除t1中ID等于t2中ID所有行和t2ID等于t3中ID所有行。...delete t1,t2 from t1,t2,t3 where t1.id = t2.id and t2.id = t3.id; 或 delete t1,t2 using t1,t2,t3 where...专业名,成绩 from xs,xs_kc; 加条件连接 理解:两个表中学号有不一样,如果不加条件,则会把学号一样和不一样 学生专业名和成绩都查出来,加了条件后,只会把两个表中学号一样学生(即同一个学生

    80240

    explain索引优化学习

    :子查询结果,其id为N partitions表示查询将从中匹配记录分区 type表示连接类型,是查看索引执行情况一个重要指标。...有个关键问题浮出水面:key_len是如何计算?...图片 我们看到表t1命中索引是const(常量),而t2命中索引是sue库t1id字段。...rows 该列表示MySQL认为执行查询必须检查行数。 图片 对于InnoDB表,此数字是估计,可能并不总是准确。 filtered 该列表示按表条件过滤表行估计百分比。...最大为100,这表示未过滤行。100减小表示过滤量增加。 图片 rows显示了检查估计行数,rows× filtered显示了与下表连接行数。

    55230
    领券