华为程序员面试题:调整SQL的执行顺序,对性能有没有影响

数据库 SQL Server
每年的3,4月份都是求职的高峰期,今天我们来分享一个经典的面试题,这个题目是来自一位粉丝最近参与的一次华为面试后台工程师面试。

每年的3,4月份都是求职的高峰期,今天我们来分享一个经典的面试题,这个题目是来自一位粉丝最近参与的一次华为面试后台工程师面试。 

[[320704]]

我们有一个交易系统,每当发生一次交易操作的时候,会发生下面几个事情,增加一条交易记录,买家的金额减少X元,卖家的金额增加X元。很显然,为了保证数据的一致性,我们需要在事务下完成这三个操作,那么,这3条sql的执行顺序,对系统的系能有没有什么影响呢?

大家都知道,在数据库中,如果有多个不同的任务同时对同一行数据有更新,那么就可能会出现并发问题。为了解决这个问题,Mysql有着复杂的锁的机制,一般情况下,我们这种只更新某一行的数据通常使用的的是Mysql的行锁。同时在所有的数据库操作中,我们必须保证一个状态到另外一个状态的数据一致性,也就是事务,那么Mysql的事务跟锁有什么关系呢?

Mysql的行锁,是在需要的时候申请,但并不是立马释放,而是等到事务结束后才释放,我们称之为二阶段协议。基于这样的一种设定,如果我们要提高系统的整体性能,就要让等到锁的时间越少越好,也就是并发越高的修改,放到越后面,这样子,就能够在处理完当前数据库操作之后,尽快地提交事务,并释放锁,交给下一个任务。

在上述例子中,增加一条交易记录,一般都是追加的操作,不需要加锁,而给买家的金额减X元,通常,一个买家同一时间内,都不会有并发,即使有(例如手机,APP同时下单付款等)那也是非常小的概率事件,但是对于卖家就不一定了,特别是一些爆品,卖家设置可能在1秒钟内完成数百次甚至上千次并发。所以,我们应该把卖家金额的变更放到最后,那样能够很大程度地提升系统的性能。

 

责任编辑:华轩 来源: 今日头条
相关推荐

2011-04-15 10:38:31

程序员

2012-05-25 10:15:06

Java程序员面试题

2010-05-10 17:07:54

Oracle SQL条

2011-03-24 13:27:37

SQL

2020-04-08 10:18:56

MySQL数据库SQL

2020-10-27 09:42:26

戴尔VMware分拆VMware

2023-01-30 09:16:58

MySQL雪花算法

2020-02-06 08:58:09

程序员技术数据库

2015-08-25 16:00:43

2018-12-03 09:42:32

Java程序员阿里面试

2015-02-10 10:21:22

程序员

2011-03-29 14:31:41

CC++

2009-08-02 10:21:39

ASP.NET程序员面ASP.NET

2020-04-26 09:48:11

MySQL数据库架构

2018-09-11 10:04:27

程序员面试数据结构

2012-10-31 11:16:04

程序员招聘

2020-04-12 22:29:50

程序员MySQL数据

2020-05-06 15:02:58

MySQL数据库技术

2012-05-07 08:18:42

程序日志性能

2022-04-28 08:52:40

懒加载Web
点赞
收藏

51CTO技术栈公众号