Mysql的行锁只锁一行记录吗?

InnoDB行锁是通过给索引上的索引项加锁来实现的,这一点MySQL与Oracle不同,后者是通过在数据块中对相应数据行加锁来实现的。
InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁,否则,InnoDB将使用表锁,会把所有扫描过的行都锁定!

在实际应用中,要特别注意InnoDB行锁的这一特性,不然的话,可能导致大量的锁冲突,从而影响并发性能。
由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录,但是如果是使用相同的索引键,是会出现锁冲突的。
当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;

另外间隙锁也会锁多行,InnoDB除了通过范围条件加锁时使用间隙锁外,如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!

当发生死锁的时候,Innodb目前处理死锁的方法是将持有最少行级排他锁的事务进行回滚。

查看INNODB中可能存在的死锁情况:
SHOW ENGINE INNODB STATUS

[读书笔记]图解CIO工作指南-IT组织和人才

IT运营的功能划分为管理和服务两方面:

  1. IT管理功能,包括IT战略、IT计划、IT投资、IT成本管理、项目群管理、IT资产管理、IT系统推广、协助推动业务变革。
  2. IT服务功能:IT系统构思、需求分析、系统设计、开发、运营和维护,以及IT基础设施、IT采购和IT项目管理。

IT运营与企业内其他部门的协作关系:

  1. 经营层:确认IT规划、IT投资、IT成本和IT风险管理的有效性
  2. IT和业务部门共同完成的职责:IT战略和IT投资
  3. 业务部门为主的工作:推动业务变革和IT系统的普及使用,IT起到协助的作用。
  4. IT为主的工作:上面提到的IT服务包含的所有工作,包括IT管理中的战略、组织和人才

IT母公司和分子公司的关系

  1. 上游功能专注型:母公司负责IT管理的所有工作以及IT系统、基础设施的设计,分子公司负责基础设施的构建、应用程序开发和应用。在IT服务提供领域,母公司可以适当放权,将系统级的设计、开发、采购、运营、项目管理下方到子公司。
  2. 战略功能专注型:母公司负责IT总体的战略、计划、投资、成本、项目群管理、组织和人才管理,如果母公司更偏向与战略,其管理范畴就只包括IT总体的战略、计划、投资、成本。

以上每种模式各有优缺点,需要CIO根据公司经营事业、IT部门的状况选择最适合的一种。

IT组织的三种形态

  1. 集权型:IT运营所有功能集中在IT部门,适合在全公司层面优化IT运用,发挥统筹管理的效果,尤其适合于各业务部门之间关联性较强的情况;缺点是难以配合各业务部门的需求和效率。
  2. 分权型:IT运营功能仅配置在业务部门,容易和业务部门配合,但会导致出现重复建设的问题
  3. 联邦型:IT运营功能分散在业务部门的IT团队以及母公司的IT部门,能够充分发挥集权型和分权型的优势,但母公司IT部门和业务部门IT团战的协调、管理负担较重。

IT应强化的两大功能

  1. IT战略:确保IT的工作与组织的中长期经营战略和事业战略相匹配,IT应该和经营层、业务部门深入沟通,在此基础上确定IT的运用分支
  2. 协助推动业务变更:在业务产生变革想法的阶段,IT就应该提供咨询和帮助,尤其在如何利用IT的部分提供支援。

总体上,IT应该完成从成本中心到业务伙伴转变,IT的传统是按照经营和业务部门的需求完成系统构建,并并保证稳定运行;但在全球化、数字化的背景下,经营层对IT的期待发生了改变,更期望IT为商业模式的变革、业务流程的变革等经营课题的解决方案提供相应机制。

企业的IT人才类型

  1. IT策划人才
    • IT战略规划师:负责IT战略的制定和推进
    • IT商务主管:负责业务变革和相关业务系统的车号
    • IT分析师:IT项目的可行性分析和确认、系统化构思、计划和需求定义
  2. IT服务提供人才
    • IT架构师:IT架构设计、IT标准(应用程序和数据结构的标准化)制定
    • 项目经理:项目立项,交付期、品质、成本的管理
    • 应用工程师:系统需求定义、应用程序的设计、开发和运营
    • 技术工程师:系统基础架构的设计和运营,软硬件的采购规格制定
    • 系统运营经理:系统容量设计、故障管理、系统变更管理,能够完善整体运营流程的优化

IT人才培养

为了培养同时精通业务和IT的人才,需要在业务边和IT部门之间建立人事轮岗制度。
在IT战略方面,为培养全公司整体优化的视点,建议建立经营企划部门和IT部门的兼容和轮岗制度。

  1. IT策划人才:不以IT专业能力为目的,从业务部门和IT部门的企划人才中重点培养
  2. IT架构师:从新开发系统机会进行培养俯瞰系统、理解系统架构的能力,IT架构师需要理解和掌握不断变化的IT技术,企业内部的信息收集和研究开发能力有限,必要的时候可以借助于外部专家和供应商合作伙伴。
  3. 其他人才,在系统开的和运营等实践经验的积累进行培养。

[读书笔记]图解CIO工作指南-工作职责和工作领域

CIO工作职责

  1. 在企业经营和业务运作中推进IT运用,成为企业经营层和IT之间的沟通桥梁

要求具备沟通能力、领导能力、协调能力,以及对业务的深入理解
实现形式:
成立CIO办公室,为CIO决策提供所需信息,准备与业务、IT子公司的协同工作;
可以是IT部门内部领导兼职的虚拟组织。

  • 2. 统管IT部门和信息系统

擅长IT实务的管理者,具备构建、维护复杂系统的能力,同时能正确判断突发问题的风险并解决问题。
常见的方式是CIO负责沟通,其他管理负责人负责此职责(美国企业中的CTO职责)

工作领域

  • 战略、治理

与企业经营者一起制定符合企业战略的IT战略,并确定实现该战略的治理机制

  • 投资、成本
  • IT组织、人才

确定IT、业务、IT分子公司、外部供应商的职责和责任划分,在此基础上确定IT组织形态
同时制定IT人才标准,并努力获得和培养

  • 资源管理

包含企业内部资源(人力、物力、资金)和外部资源(供应商、专家、外包服务商),建立外部资源管理框架

  • IT服务

包含应用系统的开发、实施、问题咨询和处理

  • IT风险

评估系统故障、停机、信息安全泄露的风险并建立对策

  • IT架构

根据企业经营和业务战略追求的商业模型,构思企业信息系统的整体结构,即IT架构,并建立起对应的管理框架

项目管理修炼之道-第七章 项目团队

团队角色必须齐全,人员可以兼职
架构师、开发人员、测试人员
技术文案、发布工程师
项目经略、业务分析师

团队凝聚力
如果大家有同一目标,彼此承诺完成相互依赖的工作,而且采用商定好的工作方式,这就是一个团队。
如果希望团队凝聚在一起,那么就帮他们制定一些只有共同工作才能完成的短期目标。

软件开发团队必备的工具
SCM-版本管理
DTS-缺陷跟踪

组织
大部分项目经理都工作于职能组织或矩阵组织,很少一部分在基于项目的组织工作。
职能型组织在项目中存在汇报关系和项目管理关系不一致的情况,项目会在不同的职能团队传递,项目经理难以评估和控制项目。
矩阵团队,会倾向于让成员同时参加多个项目,项目经理要说服只能经理认识到这种做法的不利之处。
项目经理要职能经理确认,对项目成员的表现进行反馈和评价。

多于6人的团队会自动拆分为几个小组,
项目经理如果管理超过9人的团队,每个小组需要指定技术带头人,协助项目经理管理规模过大的团队。
技术带头人:带领团队开发功能的人。

团队发展5阶段:
组建期 团队刚成立
激荡期 共同工作并彼此试探
规范期 行为意见达成一致
表现期 更加紧急的合作
终止期 项目完成,团队解散

项目经理在项目中的权力,取决于项目的战略位置,可以从了解项目状态的人数和级别来判断。
项目经理要树立权威,利用自己的影响力让人们完成你需要他们做的事情。

项目应在启动时配备需要的人员,每次人员变动都会对团队的工作效率产生影响。
项目中期因谨慎考虑增加新成员,向进度落后的项目增加人手,只会让项目更加落后–Brooks法则
项目快结束时应避免新增人手

项目的技能树

  • 人际交往技能

倾听、谈判、写作
目标导向、了解团队成员、适应信息不足的情况
管理细节、解决问题的技巧

  • 项目管理的功能性技能

项目的生命周期
日程规划、任务评估和安排
利用团队成员不全技术的不足
评估、管理风险

  • 领域专业技能

业务领域的理解,有助于理解需求、划分优先级
了解IT系统的架构,有助于识别技术风险
工具和技术的专业技能
项目管理的软件、技能

技术选型要素及能力培养

原文地址:滴滴出行技术总监:关于技术选型的那些事儿

技术选型三要素

一、技术

1、取长避短
Go语言,运行性能高、方便使用多核资源、编译快,适合无状态的服务端模块,弱点是GC机制,不适合做内存管理相关的服务
2、关注发展前景
技术的生命周期要显著大于项目的周期
正面:滴滴webp app前端使用vue.js,作者全职后,规划、投入、问题解决方面能够跟得上
反面:jQuery曾经是前端的万用工具,目前逐渐被组件化的开发模式取代,不再是首选

二、业务

初创期:灵活,适应业务的快速变化,如数据存储采用MongoDB
稳定期:可靠,如Twitter从RoR切换到Java
维护期:妥协,重点考虑历史代码迁移的成本

三、人

调研过程团队参与,决策必须专制
不是所有的人都对决策结果负责,必须有人负责带领大家走一条曲折的路线
技术决策对人的能力依赖很高,取决于个人的眼界、经验、业务敏感度、逻辑性。

如何培养技术选型的能力?

一、保持敏感度和广度

选型的时候,需要保证所有的思考是基于可验证的事实,而不是根据网上碎片化的信息
保持持续的信息输入、内化,并发现信息的关联性,建立知识模型,调用关联的知识做全面决策。
输入:保持碎片化学习,增量更新过时的内容。

二、建立知识体系

建立知识体系:看书,如何将知识拆解层章节,最后能整体掌握
统一的知识体系:语言、API、工程化、框架和设计模式

前端的例子

语言:Javascript / HTML / CSS,小众化的TypeScript,CoffeeScript
API:各种标准和接口的调用
工程化:打包发布工具、代码转换、辅助开发工具
框架:Vue、React
设计模式:PWA、redux

在Mysql中模拟ROW_NUMBER, RANK, DENSE_RANK

从MariaDB 10.2.0版本,开始支持window类函数,但现在还不是正式版本,不建议在生产环境使用。
可以使用下面的sql语句,模拟ROW_NUMBER, RANK, DENSE_RANK函数的功能。这种写法不需要做表的自连接,性能会比较好。

SELECT
  @row_num:=IF(@prev_col1=t.col1 AND @prev_col2=t.col2, @row_num+1, 1) AS row_number,
  @dense:=IF(@prev_col1=t.col1 AND @prev_col2=t.col2, IF(@prev_col3=col3, @dense, @dense+1), 1) AS dense_rank,
  @rank:=IF(@prev_col1=t.col1 AND @prev_col2=t.col2 AND @prev_col3=col3, @rank, @row_num) AS rank,
  t.*,
  @prev_col1:=t.col1, @prev_col2:=t.col2, @prev_col3:=t.col3
FROM (SELECT * FROM table1 ORDER BY col1, col2, col3 DESC) t,
     (SELECT @row_num:=1, @dense:=1, @rank:=1, @prev_col1:=NULL, @prev_col2:=NULL, @prev_col3:=NULL) var

Oracle中的Java调用

项目中碰到一个特殊情况,部分功能必须通过Java实现,记录一下在Oracle中调用Java的方法。
实时使用的时候要慎重考虑,是否需要这么复杂的方案。

方法一:在PL/SQL中直接写java源代码,适合简单功能的测试,毕竟在PL/SQL中写Java代码还是很麻烦的。

create or replace and compile java source named TestClass as
package com.example;
public class TestClass
{
  public static String getMessage(String message) {
    return message + "...";
  }
}

将java的功能封装成一个函数

create or replace function java_get_messasge(message varchar2)
return varchar2
as language java name
'com.example.TestClass.getMessage(java.lang.String) return java.lang.String';

调用函数

select java_get_messasge('hello') from dual;

在user_objects可以查询到创建的java程序、编译后的CLASS

SELECT * FROM user_objects t
where t.OBJECT_type IN ('JAVA CLASS', 'JAVA SOURCE');

方法二:将java的class文件或jar包导入到数据库中

loadjava -user user/password /path/TestClass2.class

剩下的步骤同方法一

HTML5本地数据库功能测试

HTML5可以直接创建和访问本地的Sqlite数据,对于暂存一些业务数据应该是足够使用,可惜IE和Firefox都不支持,大大限制了实际使用场景。
下面是几个核心API的用法,并在Chrome浏览器下测试通过。

创建数据库和表

function open_db(db_name) {
    var db = openDatabase(db_name, '1.0', db_name, 1024*1024);
    create_table(db);
    return db;
}

function create_table(db) {
    db.transaction(function (trans) {
        trans.executeSql("create table if not exists users(nick_name text null, phone_number text null)",
            [],
            function (ts, data) {},
            function (ts, message) {
                alert(message);
            }
        );
    });
}

插入和查询数据

$('#btn-create').click(function() {
    var db = open_db('contacts');
    if (!db) {
        alert('无法创建本地数据库!');
        return false;
    }
    var nick_name = $('#nick_name').val();
    var phone_number = $('#phone_number').val();
    db.transaction(function (trans) {
        trans.executeSql("insert into users values(?, ?)", [nick_name, phone_number],
            function (ts, data) {
                alert('创建成功!');
            },
            function (ts, message) {
                alert(message);
            }
        );
    });
});
$('#btn-list').click(function() {
    var db = open_db('contacts')
    var keyword = $('#keyword').val();
    db.transaction(function (trans) {
        trans.executeSql("select * from users where nick_name like '%' || ? || '%' ", [keyword],
            function (ts, data) {
                $('#user-list').empty();
                for(var i=0; i < data.rows.length; i++) {
                    var row = data.rows.item(i);
                    var line_text = row.nick_name + '|' + row.phone_number;
                    $('<p>' + line_text + '</p>').appendTo('#user-list');
                }
            },
            function (ts, message) {
                alert(message);
            }
        );
    });
});

页面加载时间记录

在分析前端页面的加载时间,常用的工具就是浏览器自带的分析工具,如Chrome的开发者工具等,但这种方法只限于人工单次分析,无法大批量的采集数据。

传统的js脚本,必须在页面的各种事件进行埋点,与正常的业务功能可能会有较差,且取不到页面加载的过程信息。

Html5的Web Preformance API带来了全新的方法,包含的Navigation Timing API可以解决大部分的页面性能分析需求,对于IE浏览器需IE9及之后上版本才支持。

下图是页面加载周期中的各类事件触发顺序,可以选择自己感兴趣的时间点进行记录和分析。

下面是一个示例的使用方法,注意使用了定时器来获取数据,否则会取不到loadEventEnd的时间。

(function() {
    if (!window.performance) return;
    var timer = setInterval(function() {
        var page = performance.timing;
        if (page.loadEventEnd > 0) {
            clearInterval(timer);
            var timeModel = {};
            timeModel.prepareTime = page.connectEnd - page.fetchStart;
            timeModel.responseTime = page.responseStart - page.requestStart;
            timeModel.pageDownloadTime = page.responseEnd - page.responseStart;
            timeModel.resourceDonwloadTime = page.domContentLoadedEventEnd - page.domLoading;
            timeModel.domRenderTime = page.domComplete  - page.domContentLoadedEventEnd;
            timeModel.loadTime = page.loadEventEnd - page.loadEventStart;
            timeModel.totalTime = page.loadEventEnd - page.fetchStart;

            $.post('timing.jsp', timeModel);
        }
    }, 3000);
})();

参考资料:
Navigation Timing

从公司的基因谈互联网业务的转型

原文:为何微软和IBM都难以转型互联网?

文章中剖析了公司的基因,主要体现几个方面:

一、管理,成熟企业求稳健发展与业务创新的冲突,体现在流程控制、风险管理,薪酬管理等方方面面。

所有成功的企业,在经历了创业期、发展期后,很快就需要进入一个防范出现大问题、大错误,以稳定发展为主的管理模式,是无法给新业务提供空间的。任何一个大企业,其实在管理上,都难以说有活力,管理几千人,几万甚至几十万人,实际上需要把每一个人当螺丝钉去管理,否则一定会大乱。因此,在成熟企业里,大家讲的是风险控制,是流程规范,是人人防控。而对于任何一个新业务、新产品与新服务,在一开始,是不能讲严格与规范管理的,恰恰需要的是不讲流程规矩的快速反应,不断犯错,是人治,不是法治。但这都不容于一个规范成熟企业。

二、人,习惯于成熟业务的人,从思想意识和行为习惯上,是不满足创新型业务的要求,即使有新人引入,也会因环境不适应的问题难以成功。

在一个很成熟的企业里,经过多年的发展,物以类聚,人以群分,已经自我沉淀积累了一批有共同特性与文化的核心骨干,很难诞生适合新业务的人,即便花巨资引进所谓优秀的专业团队,最后也会很快因为管理方式、理念等不同,水土不服而夭折,更不要说扩大发展的问题

三、文化

文化是一只看不见的手,在企业的发展过程中,围绕创始人与核心骨干,逐渐渗透在企业的各个方面,大到管理的模式与理念,小到用人的类型、员工活动,无处不在。在这种企业里,一句无意或者有意的风险提示,往往胜过一颗勇敢的心。因为人的类型不同,文化理念上,更是会处处碰壁,无法融入。
文化是一个弥漫在空气中的东西,一时没有明显感知与不适应,但日复一日,怨气日盛,最后让新业务与新人类无法生存,自动放弃离开。

最后,文章给出的结论,想要参与新兴业务,最好就是资本运作的方式,收购、参股等。