技术文章

分布式柔性事务之Saga详解

独自空忆成欢 提交于 2021-02-17 10:13:22
- 起源 - Saga模型起源于1987年 Hector Garcia-Molina,Kenneth Salem 发表的论文《Sagas》,是分布式事务相关概念最早出现的。 Saga模型是把一个分布式事务拆分为多个本地事务,每个本地事务都有相应的执行模块和补偿模块(对应TCC中的Confirm和Cancel),当Saga事务中任意一个本地事务出错时,可以通过调用相关的补偿方法恢复之前的事务,达到事务最终一致性。 - 组成 - Saga模型主要分: 一串子事务(本地事务)的事务链 每个Saga子事务Tn, 都有对应的补偿定义 Cn用于撤销Tn造成的结果 每个Tn都没有“预留”动作,直接提交到库。 执行顺序: 子事务序列 T1, T2, …, Tn得以完成 (最佳情况) 或者序列 T1, T2, …, Tj, Cj-1, …, C2, C1, 0 < j < n, 得以完成 数据隔离性: 业务层控制并发 在应用层加锁 应用层预先冻结资源等 恢复方式: 向后恢复:补偿所有已完成的事务,如果任一子事务失败 向前恢复:重试失败的事务,假设每个子事务最终都会成功 从Saga模型的上述定义中,Saga 模型可以满足事务的三个特性: 原子性:Saga 协调器协调事务链中的本地事务要么全部提交,要么全部回滚。 一致性:Saga 事务可以实现最终一致性。 持久性:基于本地事务,所以这个特性可以很好实现

python3绝对路径,相对路径

好久不见. 提交于 2021-02-17 10:12:08
from __future__ import absolute_import的作用: 直观地看就是说”加入绝对引入这个新特性”。说到绝对引入,当然就会想到相对引入。那么什么是相对引入呢?比如说,你的包结构是这样的: pkg/ pkg/init.py pkg/main.py pkg/string.py 如果你在main.py中写import string,那么在Python 2.4或之前, Python会先查找当前目录下有没有string.py, 若找到了,则引入该模块,然后你在main.py中可以直接用string了。如果你是真的想用同目录下的string.py那就好,但是如果你是想用系统自带的标准string.py呢?那其实没有什么好的简洁的方式可以忽略掉同目录的string.py而引入系统自带的标准string.py。这时候你就需要from __future__ import absolute_import了。这样,你就可以用import string来引入系统的标准string.py, 而用from pkg import string来引入当前目录下的string.py了 --------------------- 但是经过实验,去掉跟加上from __future__ import absolute_import并没有什么区别,上面说的好像并没有什么卵用: 目录结构: ##

url中文乱码解决大全

ぃ、小莉子 提交于 2021-02-17 10:09:20
使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码。 一、初级解决方法 通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行解码转换,然后再按照 gb2312 进行编码,最后得到正确的内容。示例代码如下: http://xxx.do?ptname=' 我是中国人' String strPtname = request.getParameter("ptname"); strPtname = new String(strPtname.getBytes("ISO-8859-1"), "UTF-8"); String para = new String( request.getParameter("para").getBytes("iso8859-1"), "gb2312"); 具体的原因是因为美国人在写 tomcat 时默认使用 iso8859-1 进行编码造成的。 然而,在我们的 servlet 和 jsp 页面中有大量的参数需要进行传递,这样转换的话会带来大量的转换代码,非常不便。 二、入门级解决方法 后来,大家开始写一个过滤器,在取得客户端传过来的参数之前,通过过滤器首先将取得的参数编码设定为 gb2312 ,然后就可以直接使用 getParameter 取得正确的参数了。这个过滤器在 tomcat

图形的相对定位---绝对定位 ------ 固定定位

别等时光非礼了梦想. 提交于 2021-02-17 10:07:23
相对定位:占位置 <! DOCTYPE html > < html lang ="en" > < head > < meta charset ="UTF-8" > < title > Title </ title > < style > .box { width : 200px ; height : 200px ; background-color : red ; position : relative ; /* 相对定位占位置,后面的元素接着排列 */ top : 30px ; /* 在margin-top的位置基础上移动,这样就压盖了下面的图形 */ left : 40px ; /* 在margin-top的位置基础上移动,这样就压盖了下面的图形 */ margin-top : 30px ; /* 两个div一起向下移动30px */ } .box2 { width : 200px ; height : 200px ; background-color : green ; } </ style > </ head > < body style ="height: 2000px;" > < div class ="box" ></ div > < div class ="box2" ></ div > </ body > </ html > 绝对定位:不占位置,脱标了 <!

mysql中常见约束

丶灬走出姿态 提交于 2021-02-17 10:06:33
1 #常见约束 2 3 /* 4 5 6 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性 7 8 9 分类:六大约束 10 NOT NULL:非空,用于保证该字段的值不能为空 11 比如姓名、学号等 12 DEFAULT:默认,用于保证该字段有默认值 13 比如性别 14 PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空 15 比如学号、员工编号等 16 UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空 17 比如座位号 18 CHECK:检查约束【mysql中不支持】 19 比如年龄、性别 20 FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值 21 在从表添加外键约束,用于引用主表中某列的值 22 比如学生表的专业编号,员工表的部门编号,员工表的工种编号 23 24 25 添加约束的时机: 26 1.创建表时 27 2.修改表时 28 29 30 约束的添加分类: 31 列级约束: 32 六大约束语法上都支持,但外键约束没有效果 33 34 表级约束: 35 36 除了非空、默认,其他的都支持 37 38 39 主键和唯一的大对比: 40 41 保证唯一性 是否允许为空 一个表中可以有多少个 是否允许组合 42 主键 √ × 至多有1个 √,但不推荐 43 唯一 √ √

MySQL常见约束

百般思念 提交于 2021-02-17 10:06:11
#常见约束 /* 含义:一种限制,用于限制表中的数据,为了保证表中的数据的准确和可靠性 分类:六大约束   NOT NULL:非空,用于保证该字段的值不能为空   比如姓名、学号等   DEFAULT:默认,用于保证该字段有默认值   比如性别   PRIMARY KEY:主键,用于保证该字段的值具有唯一性,并且非空   比如学号、员工编号等   UNIQUE:唯一,用于保证该字段的值具有唯一性,可以为空   比如座位号   CHECK:检查约束【mysql中不支持】   比如年龄、性别   FOREIGN KEY:外键,用于限制两个表的关系,用于保证该字段的值必须来自于主表的关联列的值   在从表添加外键约束,用于引用主表中某列的值   比如学生表的专业编号,员工表的部门编号,员工表的工种编号 添加约束的时机:   1.创建表时   2.修改表时 约束的添加分类:     列级约束:       六大约束语法上都支持,但外键约束没有效果     表级约束:       除了非空、默认,其他的都支持 主键和唯一的大对比:     保证唯一性    是否允许为空  一个表中可以有多少个   是否允许组合   主键   √        ×        至多有1个        √,但不推荐   唯一   √        √        可以有多个        √,但不推荐

Vue技术点整理-Vue Router

蓝咒 提交于 2021-02-17 10:05:20
路由 Vue Router 对于单页面应用来说,如果涉及到多个页面的话,就必须要使用到路由,一般使用官方支持的 vue-router 库 一, Vue Router 在项目中的安装引用 1,在页面中使用<script>快速使用Vue Router开发 <!doctype html> <html> <head> <meta charset="utf-8"> <title>使用script直接引入Vue Router</title> </head> <body> <script src="https://unpkg.com/vue/dist/vue.js"></script> <script src="https://unpkg.com/vue-router/dist/vue-router.js"></script> <div id="app"> <h1>页面共同header</h1> <p> <router-link to="/first">页面1</router-link> <router-link to="/second">页面2</router-link> </p> <router-view></router-view> </div> <script> // template也可以使用import从外部引入进来 const first = { template: '<div>I

【转载】关于Python的Mixin模式

£可爱£侵袭症+ 提交于 2021-02-17 10:04:11
本博按: mixin是看起来是多继承的一种,但是,这种继承并不作为父类存在,而是增加功能到子类中。 像C或C++这类语言都支持多重继承,一个子类可以有多个父类,这样的设计常被人诟病。因为继承应该是个”is-a”关系。比如轿车类继承交通工具类,因为轿车是一个(“is-a”)交通工具。一个物品不可能是多种不同的东西,因此就不应该存在多重继承。不过有没有这种情况,一个类的确是需要继承多个类呢? 答案是有,我们还是拿交通工具来举例子,民航飞机是一种交通工具,对于土豪们来说直升机也是一种交通工具。对于这两种交通工具,它们都有一个功能是飞行,但是轿车没有。所以,我们不可能将飞行功能写在交通工具这个父类中。但是如果民航飞机和直升机都各自写自己的飞行方法,又违背了代码尽可能重用的原则(如果以后飞行工具越来越多,那会出现许多重复代码)。怎么办,那就只好让这两种飞机同时继承交通工具以及飞行器两个父类,这样就出现了多重继承。这时又违背了继承必须是”is-a”关系。这个难题该怎么破? 不同的语言给出了不同的方法,让我们先来看下Java。Java提供了接口interface功能,来实现多重继承: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 public abstract class Vehicle { } public

移动端input和ios的问题

北城余情 提交于 2021-02-17 10:03:34
<input unselectable="on" onfocus="this.blur()" id="ticket" type="text" placeholder="请选择票据类型" :value="ticketType" readonly="readonly"> unselectable="on" onfocus="this.blur()" 解决移动端IOS的input框只读状态还有光标的问题 <input id="phone" type="tel" pattern="[0-9]*" placeholder="请输入手机号码" v-model="phone" onkeyup="phoneType"> onkeyup时间解决浏览器不能限制字符数量,函数phoneType限制了只能输入数字 phoneType phoneType(a){ let v = this.phone; if (v) { this.phone = v.replace(/\D/g, ''); if (v.length > 11) { this.phone = v.slice(0, 11); } }; 解决了ios端输入框有焦点了 整体都放大的问题 <meta name="apple-mobile-web-app-capable" content="yes"> <meta name="viewport"

iOS 可高度自定义的底部弹框

纵饮孤独 提交于 2021-02-17 10:03:07
技术: iOS Objective-C 概述 一个可以让开发者通过编写 tableView 的内容随心所欲的定制自己想要的底部弹框 详细 代码下载: http://www.demodashi.com/demo/14901.html 一. 运行效果图 二. 实现过程 1. 实现一个有遮罩效果的半透明 view,然后添加一个可设置展示内容高度的 contentView // 这个遮罩是可以遮住全屏 - (void)createUI{ self.frame = CGRectMake(0, 0, SS_ScreenW, SS_ScreenH); self.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.4]; self.userInteractionEnabled = YES; [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(disMissView)]]; [self.contentView addSubview:self.tbView]; } // contentView 是通过懒加载实现的 - (UIView *)contentView{ if (!