try

一文解读分布式事务 (转)

大城市里の小女人 提交于 2019-12-06 23:46:42
这篇文章将介绍什么是分布式事务,分布式事务解决什么问题,对分布式事务实现的难点,解决思路,不同场景下方案的选择,通过图解的方式进行梳理、总结和比较。 相信耐心看完这篇文章,谈到分布式事务,不再只是有“2PC”、“3PC”、“MQ的消息事务”、“最终一致性”、“TCC”等这些知识碎片,而是能够将知识连成一片,形成知识体系。 什么是事务 介绍分布式事务之前,先介绍什么是事务。 事务的具体定义 事务提供一种机制将一个活动涉及的所有操作纳入到一个不可分割的执行单元,组成事务的所有操作只有在所有操作均能正常执行的情况下方能提交,只要其中任一操作执行失败,都将导致整个事务的回滚。 简单地说,事务提供一种“ 要么什么都不做,要么做全套(All or Nothing)”机制。 数据库事务的 ACID 属性 事务是基于数据进行操作,需要保证事务的数据通常存储在数据库中,所以介绍到事务,就不得不介绍数据库事务的 ACID 特性。 ACID 指数据库事务正确执行的四个基本特性的缩写,包含: 原子性(Atomicity) 整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。 事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 例如:银行转账,从 A 账户转 100 元至 B 账户,分为两个步骤: 从 A 账户取 100 元。

使用 HTML5 IndexedDB API

拟墨画扇 提交于 2019-12-06 22:48:04
HTML5 的一个重要特性是本地数据持久性,它使用户能够在线和离线访问 Web 应用程序。此外,本地数据持久性使移动应用程序更灵敏,使用的带宽更少,而且能够在低带宽场景中更高效地工作。HTML5 提供了一些本地数据持久性选项。第一个选项是 localstorage,它支持您使用一个简单的键值对来存储数据。IndexedDB(一个更加强大的选项)支持您本地存储大量对象,并使用健壮的数据访问机制检索数据。 IndexedDB API 取代了 Web Storage API,后者在 HTML5 规范中已不推荐使用。(但一些领先的浏览器仍然支持 Web Storage,其中包括苹果公司的 Safari 和 Opera Web 浏览器)与 Web Storage 相比,IndexedDB 具有多个优势,其中包括索引、事务处理和健壮的查询功能。本文将通过一系列的示例来展示如何管理 IndexedDB 数据库。(参见 下载 一节,获取示例的完整源代码。) 重要概念 一个网站可能有一个或多个 IndexedDB 数据库,每个数据库必须具有惟一的名称。 一个数据库可包含一个或多个对象存储。一个对象存储(由一个名称惟一标识)是一个记录集合。每个记录有一个键 和一个值。该值是一个对象,可拥有一个或多个属性。键可能基于某个键生成器,从一个键路径衍生出来,或者是显式设置。一个键生成器自动生成惟一的连续正整数

Java实现简单网络聊天程序

孤街浪徒 提交于 2019-12-06 20:02:29
1.socket 在进行网络编程前,我们需要了解socket。我们知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层。 TCP/IP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP协议是应用层协议,主要解决如何包装数据。 那么socket是啥呢? 首先呢,socket就是网络通信的工具,任何一门语言都有socket,他不是任何一个语言的专有名词,而是大家通过自己的程序与其他电脑进行网络通信的时候都用它。 实际上socket是对TCP/IP协议的封装,它的出现只是使得程序员更方便地使用TCP/IP协议栈而已。socket本身并不是协议,它是应用层与TCP/IP协议族通信的中间软件抽象层,是一组调用接口(TCP/IP网络的API函数)。 socket非常类似于电话插座。以一个国家级电话网为例。电话的通话双方相当于相互通信的2个进程,区号是它的网络地址;区内一个单位的交换机相当于一台主机,主机分配给每个用户的局内号码相当于socket号。任何用户在通话之前,首先要占有一部电话机,相当于申请一个socket;同时要知道对方的号码,相当于对方有一个固定的socket。然后向对方拨号呼叫,相当于发出连接请求。对方假如在场并空闲,拿起电话话筒,双方就可以正式通话,相当于连接成功。双方通话的过程,是一方向电话机发出信号和对方从电话机接收信号的过程

springBoot整合Redis

北城余情 提交于 2019-12-06 18:54:35
一、引入redis包 springboot 版本2.2.0 <!--redis依赖--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency> 二、仅做配置 springboot 自动装配类为: RedisAutoConfiguration 正常情况下,只需要配置yml 文件或property 文件就可以使用 redisTemplate 进行redis 操作,以yml配置为例 1、单机redis配置 spring: redis: password: zjl123 jedis: pool: max-active: 200 max-idle: 20 min-idle: 5 max-wait: -1 host: 192.168.244.128 port: 6381 密码在redis.conf 文件里配置 pool 下的配置是redis连接池配置 max-active:最大连接数 max-idle:最大等待中的连接数量 min-idle:最小等待中的连接数量 max-wait:最大等待时长 2、sentinel模式配置 spring: redis: password: zjl123 jedis:

Thread类

五迷三道 提交于 2019-12-06 17:38:27
一、线程的编写方式 ①继承Thread类 ②实现Runnable接口( 推荐使用 ,JAVA是单继承,如果该类已经继承了一个类了,那么就只能使用实现接口的方式) class MyThread extends Thread{ @Override public void run() { System.out.println("继承Thread类"); } } class MyRunnable implements Runnable{ @Override public void run() { System.out.println("实现Runnable接口"); } } public class Test{ public static void main(String[] args) { MyThread myThread=new MyThread(); myThread.start(); Thread thread=new Thread(new MyRunnable()); thread.start(); System.out.println("main end"); } } 结果: 二、this和Thread.currentThread()各种方法的区别 this:当前 对象 Thread.currentThread():当前 线程 ① currentThread() class

贝尔的技术博客 cnbeir@163.com PHP中的错误处理、异常处理机制

这一生的挚爱 提交于 2019-12-06 17:23:44
在编写php程序时,错误处理是一个重要的部分。如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判断就打开了,如果文件不存在就会报错 ?> 那么正确的写法应该如下: <?php if(file_exists('test.txt')){ $f=fopen('test.txt','r'); //使用完后关闭 fclose($f); } ?> 一、PHP错误处理的三种方式 A、简单的die()语句; 等价于exit(); 例: if(!file_exists('aa.txt')){ die('文件不存在'); } else { //执行操作 } //如果上面die()被触发,那么这里echo接不被执行 echo 'ok'; 简洁写法: file_exits('aaa.txt') or die('文件不存在'); echo 'ok'; B、自定义错误和错误触发器 1、错误处理器(自定义错误,一般用于语法错误处理) 创建自定义错误函数(处理器),该函数必须有能力处理至少两个参数(error_level和errormessage),但是可以接受最多五个参数(error_file、error_line、error_context) 语法: function error

excel (2)

╄→尐↘猪︶ㄣ 提交于 2019-12-06 17:00:43
... poi 3.8 import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import java.util.zip.ZipEntry; import java.util.zip

JavaScript中Promise 使用、原理以及实现过程

馋奶兔 提交于 2019-12-06 16:47:36
1.什么是 Promise promise 是目前 JS 异步编程的主流解决方案,遵循 Promises/A+ 方案。 2.Promise 原理简析 (1)promise 本身相当于一个状态机,拥有三种状态 pending fulfilled rejected 一个 promise 对象初始化时的状态是 pending,调用了 resolve 后会将 promise 的状态扭转为 fulfilled,调用 reject 后会将 promise 的状态扭转为 rejected,这两种扭转一旦发生便不能再扭转该 promise 到其他状态。 (2)promise 对象原型上有一个 then 方法,then 方法会返回一个新的 promise 对象,并且将回调函数 return 的结果作为该 promise resolve 的结果,then 方法会在一个 promise 状态被扭转为 fulfilled 或 rejected 时被调用。then 方法的参数为两个函数,分别为 promise 对象的状态被扭转为 fulfilled 和 rejected 对应的回调函数 3.Promise 如何使用 构造一个 promise 对象,并将要执行的异步函数传入到 promise 的参数中执行,并且在异步执行结束后调用 resolve( ) 函数,就可以在 promise 的 then

some try on func swap about & and *

耗尽温柔 提交于 2019-12-06 16:30:56
import "fmt"func swap(x,y *int ) { //x ,y = y,x //fault /* t := *x *x = *y *y = t */ //true //*x , *y = *y ,*x //true //x , y = y , x //fault}func pri(a,b int) { fmt.Println(a) fmt.Println(b)}func main () { var a int = 1 var b int = 2 pri(a,b) swap(&a,&b) pri(a,b)} 来源: https://www.cnblogs.com/qiaoyanlin/p/11994538.html

基于ManagedDataAccess开发的OracleDBHelpe工具集伸手党的福音

风流意气都作罢 提交于 2019-12-06 15:55:02
在使用前先加入ManagedDataAccessDLL文件方可使用 添加方法:右键项目。点击管理NuGet程序包,点击浏览,在输入框内输入 ManagedDataAccess,再点击安装即可 OracleDBHelper代码如下(Copy直接用) /// <summary> ///基於.net( 向下兼容4.0)開發 OracleDBHelper工具類 ///<para>作者: 害羞的青蛙</para> ///<para>時間: 2019-12-6</para> /// </summary> public static class OracleDBHelper { /// <summary> /// 執行SQL語句返回DataTable /// </summary> /// <param name="SQL">SQL語句</param> /// <param name="DBUrl">數據庫鏈接地址</param> /// <returns></returns> public static DataTable GetDataTableBySQL(string SQL,string DBUrl) { // 获取与数据库的连接对象並且绑定连接字符串 OracleConnection conn = new OracleConnection(DBUrl); conn.Open();/