如何书写Go代码

https://golang.google.cn/doc/code.html

介绍

本文档演示了如何开发一个简单的Go包,Go tool,以及标准的fetch,build和install的方式和命令。

go tool 要求你通过一种特殊的方式管理代码,请仔细阅读文档,它解释了通过go应用最简单的启动和运行的方式。

代码管理

概述

  • Go 开发者通常将代码保存在一个workspace中
  • 一个workspace包含多个版本控制仓库(例如:通过git管理)
  • 每个repository包含一个或多个package
  • 每个package在一个文件夹下包含多个GO源文件
  • 包路径直接标明了它的引用路径

请注意,这与其他编程环境不同,在这些环境中,每个项目都有一个单独的工作区,工作区与版本控制repository紧密相关。

Workspaces

workspace根目录由两个目录构成

  • src 包含Go 源文件
  • bin 包含可执行命令文件

go tool能直接为bin目录build和install二进制可执行文件

Read More

Elasticsearch基本概念

基本概念

这里是Elasticsearch的一些核心概念,理解这些概念能帮助你极大的简化学习过程。

近实时(NRT)

Elasticsearch 是一个近实时的搜索平台,从索引文档到被找到会有轻微的延迟(通常是一秒内)。

集群

集群是一个或多个节点(服务)的集合,它们共同持有你的所有数据,并通过所有节点提供聚合索引和查询的能力,节点通过唯一的name来进行区分,默认为‘elasticsearch’,这个名称是很重要的,因为一个节点如果被设置为根据名称加入集群,这个节点只能是集群的一部分。

Read More

MySQL日志

general_log

全量日志

1
2
3
4
5
6
7
8
9
10
11
show variables like 'general%';

+------------------+----------------------------------------------------+
| Variable_name | Value |
+------------------+----------------------------------------------------+
| general_log | OFF |
| general_log_file | /usr/local/var/mysql/fangzongzhoudeMacBook-Pro.log |
+------------------+----------------------------------------------------+

set global general_log=1;
set global general_log=0;

错误日志

只记录数据库报错

binlog

记录增删改的记录

slowlog

只记录超过阈值的慢查询

文章链接 https://fangzongzhou.github.io/2018/09/07/计算机/技术栈/MYSQL/MySQL日志/

15-5-5-InnoDB中的死锁

原文

[TOC]

死锁是两个不同的事务无法进行的一种情况,因为它们互相持有另一方需要的锁,它们都等待资源可用,但却没有任何一方主动释放自己持有的锁。

多个事务在多个表中使用行锁(通过 UPDATESELECT ... FOR UPDATE)可能会导致死锁,在一些语句索引记录的锁范围中,每个事务都会获取锁但由于时序问题不会都获取到锁,此时也会产生死锁。参见例子:Section 15.5.5.1, “An InnoDB Deadlock Example”.

为了减少死锁发生的可能,应该使用事务,而不是 LOCK TABLES语句;使插入和更新数据的事务足够小,以保证它们不会开启很长时间;当不同的事务需要更新多个表或大量行时,在每个事务中使用相同的操作序列(例如: SELECT ... FOR UPDATE);为在像 SELECT ... FOR UPDATEUPDATE ... WHERE 之类的语句中使用的字段创建索引,事务隔离级别不会影响死锁的发生的可能,因为事务隔离级别影响的是读操作的行为,而导致死锁发生的是写操作。了解更多避免死锁和从死锁状态恢复的信息,可参见Section 15.5.5.3, “How to Minimize and Handle Deadlocks”.

当死锁监测开启(默认)并有死锁发生时,InnoDB会察觉到并回滚其中的一个事务(被死锁影响的事务)。如果通过 innodb_deadlock_detect 配置项禁用死锁监测,在死锁发生时,InnoDB依赖innodb_lock_wait_timeout设置来回滚事务。所以,即使你的应用逻辑是正确的,在事务重试时你也必须对这种情况做处理。在InnoDB中可以使用SHOW ENGINE INNODB STATUS查看最后的死锁。如果死锁经常发生影响事务结构和应用,可以通过 innodb_print_all_deadlocks 开启配置将所有死锁日志打印出来。更多关于死锁的发生和处理可参见:Section 15.5.5.2, “Deadlock Detection and Rollback”

Read More

13.3.3_会导致隐式提交的语句

原文链接

本章节所列出的语句(或是它们的同义词)会导致当前session中的事务隐式地结束,就像在执行该语句前调用过 COMMIT 一样。

它们中的大多数还会在执行过后隐式地进行COMMIT,目的是为了能在各自语句的事务内完成处理。事务控制和锁语句例外;如果在执行前隐式地执行了COMMIT,在执行结束就不会再次执行了

  • 定义或修改数据库对象的数据定义语句(DDL)ALTER EVENT, ALTER FUNCTION, ALTER PROCEDURE, ALTER SERVER, ALTER TABLE, ALTER VIEW, CREATE DATABASE, CREATE EVENT, CREATE FUNCTION, CREATE INDEX, CREATE PROCEDURE, CREATE ROLE, CREATE SERVER, CREATE SPATIAL REFERENCE SYSTEM, CREATE TABLE, CREATE TRIGGER, CREATE VIEW, DROP DATABASE, DROP EVENT, DROP FUNCTION, DROP INDEX, DROP PROCEDURE, DROP ROLE, DROP SERVER, DROP SPATIAL REFERENCE SYSTEM, DROP TABLE, DROP TRIGGER, DROP VIEW, INSTALL PLUGIN, RENAME TABLE, TRUNCATE TABLE, UNINSTALL PLUGIN.

    如果使用了 TEMPORARY关键字,CREATE TABLEDROP TABLE 语句将不会再提交事务(没有在临时表中应用例如 ALTER TABLECREATE INDEX等会导致事务提交的操作),然而即使没有隐式提交,这些语句也是不能被回滚的,这就意味着使用这些语句将导致事务的原子性被破坏,例如,使用CREATE TEMPORARY TABLE 然后回滚这个事务,创建出来的表仍旧存在。

    CREATE TABLE 在InnoDB作为一个单独的事务来进行处理。这意味着ROLLBACK 无法撤销当前事务中的CREATE TABLE所做的操作。

    CREATE TABLE ... SELECT分别在执行创建非临时表前和后隐式地进行COMMIT(CREATE TEMPORARY TABLE ... SELECT 不会有提交操作)

  • 在mysql数据库中隐式地使用或修改表 ALTER USER, CREATE USER, DROP USER, GRANT, RENAME USER, REVOKE, SET PASSWORD.

  • 事务控制和锁语句 BEGIN, LOCK TABLES, SET autocommit = 1 (如果当前值不是1), START TRANSACTION, UNLOCK TABLES.

    UNLOCK TABLES仅当表使用 LOCK TABLES 获取无事务表锁时才会提交事务,在 FLUSH TABLES WITH READ LOCK 后的 UNLOCK TABLES 不会有事务提交,因为它不会获取表锁。

    事务不会被嵌套,在任意事务使用 START TRANSCACTION 或它的同义词时,会导致当前事务被隐式提交。

    当XA事务是 ACTIVE 状态时,那些导致事务隐式提交的语句不能被使用

    BEGIN 和符合语句 BEGIN ... END 中的BEGIN关键字是不同的,后者不会导致隐式提交 参见Section 13.6.1, “BEGIN … END Compound-Statement Syntax”.

  • 数据加载语句 LOAD DATA INFILE. LOAD DATA INFILE 仅当数据表使用 NDB 引擎时会导致隐式提交

  • 管理语句 ANALYZE TABLE, CACHE INDEX, CHECK TABLE, FLUSH, LOAD INDEX INTO CACHE, OPTIMIZE TABLE, REPAIR TABLE, RESET(但REST PERSIST不是)

  • 复制控制语句 START SLAVE, STOP SLAVE, RESET SLAVE, CHANGE MASTER TO.

文章链接 https://fangzongzhou.github.io/2018/08/24/计算机/技术文档/MYSQL/13-3-3-会导致隐式提交的语句/

13.3.2_一些不能回滚的语句

原文地址

一些语句是不能被回滚的,通常,包括了数据定义语句(DDL),创建或删除数据库,创建删除或修改表或存储过程。

应该设计不包含上述语句的事务,如果一个事务中发生错误前使用过无法回滚的句法,那么这个事务的整个生效结果无法通过 ROLLBACK进行回滚。

文章链接 https://fangzongzhou.github.io/2018/08/23/计算机/技术文档/MYSQL/13-3-2-一些不能回滚的语句/

13.3.1—START、TRANSACTION,COMMIT,和ROLLBACK语法

13.3.1—START、TRANSACTION,COMMIT,和ROLLBACK语法

原文地址

1
2
3
4
5
6
7
8
9
10
11
12
START TRANSACTION
[transaction_characteristic [, transaction_characteristic] ...]

transaction_characteristic:
WITH CONSISTENT SNAPSHOT
| READ WRITE
| READ ONLY

BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}

控制事务的声明

  • START TRANSACTION / BEGIN 开始一个新的事务
  • COMMIT 提交当前事务,使修改持久化
  • ROLLBACK 回滚当前事务,取消当前事务内做的修改
  • SET autocommit为当前会话开启或关闭autocommit模式

MySQL默认开启autocommit模式,这意味着一旦你执行一个更新(修改)表的声明,MySQL会持久化地在disk上存储这些更新,这些修改不能被回滚。

想要使一系列声明操作失效,可以使用START TRANSACTION

1
2
3
4
START TRANSACTION;
SELECT @A:=SUM(salary) FROM table1 WHERE type=1;
UPDATE table2 SET summary=@A WHERE type=1;
COMMIT;

Read More

事务

show VARIABLES like ‘%general_log%’

set global general_log=”off”;

mybatis实现事务

执行失败

1
2
3
4
5
6
7
8
2018-08-21T15:07:24.809453Z	   70 Query	SET autocommit=0
2018-08-21T15:07:24.814319Z 70 Query select * from user_account
2018-08-21T15:07:24.821225Z 70 Query select * from user_account
2018-08-21T15:07:24.823496Z 70 Query select @@session.transaction_read_only
2018-08-21T15:07:24.823972Z 70 Query INSERT INTO usercenter.user_account (user_name,id,user_id) VALUE ('fzz','10','1001')
2018-08-21T15:07:24.825636Z 70 Query rollback
2018-08-21T15:07:24.825907Z 70 Query SET autocommit=1
2018-08-21T15:07:24.826190Z 70 Query select @@session.transaction_read_only

执行成功

1
2
3
4
5
6
7
8
2018-08-21T15:30:17.288694Z	   80 Query	SET autocommit=0
2018-08-21T15:30:17.289481Z 80 Query select * from user_account
2018-08-21T15:30:17.291729Z 80 Query select * from user_account
2018-08-21T15:30:17.293055Z 80 Query select @@session.transaction_read_only
2018-08-21T15:30:17.293494Z 80 Query INSERT INTO usercenter.user_account (user_name,id,user_id) VALUE ('fzz','6','1001')
2018-08-21T15:30:17.296491Z 80 Query commit
2018-08-21T15:30:17.297089Z 80 Query SET autocommit=1
2018-08-21T15:30:17.297414Z 80 Query select @@session.transaction_read_only
1
2
3
4
5
6
7
A事务insert

B事务insert

A事务update

B事务update产生死锁

事务隔离级别会影响死锁的发生的可能性么?

文章链接 https://fangzongzhou.github.io/2018/08/21/计算机/技术文档/MYSQL/事务/