CAS 和 ABA 问题浅析

在讨论数据库事务处理问题中,离不开 CAS 和 ABA 的问题。 CAS Compare And Swap, 先对比再替换 事实上,乐观锁用到的就是 CAS。 CAS, 现在有内存值V, 更改操作发生前的预期值A,要更改后的值B。当且仅当V==A时才进行更改操作。 原理很简单,这样真的是安全的么? ABA CAS 会导致 ABA的问题发生。我们先来看下什么是 ABA 问题。 线程one和线程two都要更新同一个数据V。此时one查V发现等于A,然后two也查V也看到是等于A,然后two开始更新V为B,更新时进行了对比发现更新时刻V确实等于A,此时two成功的进行了更改。然后two又把V(此时等于B)更新为了A。然后one开始操作更新,对比发现此时V确实等于A,就进行了更新为B的操作。 可以发现,尽管one的CAS操作是成功的,但不表示是没有问题的。因为one是期望在查询到更改之间 V是没有被更改过的,事实上是有可能被更改的。 参考 Java CAS 和ABA问题 Java并发:CAS、ABA问题、ABA问题解决方案 ……

阅读全文

悲观锁、乐观锁,浅析

悲观锁和乐观锁是并发控制常用的两种技术手段。
并发控制是用来确保 多个事务同时读写DB中同一条数据时不破坏事务的隔离性、统一性以及数据库的统一性。

……

阅读全文

fatal could not read Username for 'https://github.com' terminal prompts disabled

跟往常一样,一日不升级本机包版本就一日不舒服。今天就踩坑了 ➜ ~ brew update fatal: could not read Username for 'https://github.com': terminal prompts disabled Error: Fetching /usr/local/Homebrew/Library/Taps/homebrew/homebrew-completions failed! 怎么解决呢? ➜ ~ brew untap homebrew/homebrew-completions Untapping homebrew/completions... Untapped (105 files, 71.0KB). ➜ ~ brew update Already up-to-date. ……

阅读全文

学习SpringBoot系列 -04- 多数据源 + Druid

前面两个小节记录下了多数据源和 Druid ,本节综合起来,记录下使用 Druid 结合多数据源。跟实际项目更贴切一些。 学习SpringBoot系列 -02- 多数据源 学习SpringBoot系列 -03- 使用Druid数据库连接池 首先,需要结合前面两节的修改内容,也就是增加 properties 配置文件的多数据源配置;然后修改 pom 文件的依赖配置。为方便查看,这里再贴下修改结果。 1. application.properties 中的相关配置 foo.datasource.url=jdbc:h2:mem:foo foo.datasource.username=sa foo.datasource.password= bar.datasource.url=jdbc:h2:mem:bar bar.datasource.username=sa bar.datasource.password= 2. pom.xml 中的相关配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency> 3. 数据源类型 同样的,需要对数据源配置类进行添加,可以参考第二小节的内容。 到这里就结束了么? No…No…No, 如果此时运行程序,你会收到下面这个报错: ... Caused by: java.lang.IllegalStateException: No supported DataSource type found ... 报错信息提示已经很明显了,dataSource的Type项有错,只需要分别在foo和bar的数据源配置类中添加下配置即可: dataSourceProperties.setType(com.alibaba.druid.pool.DruidDataSource.class); 这个时候再跑一下,就正常了。 借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

学习SpringBoot系列 -03- 使用Druid数据库连接池

SpringBoot 在1.x默认使用的是 Tomcat 连接池; SpringBoot 在2.x默认使用的是 Hikari 连接池; 那么, 如何在SpringBoot工程中使用优秀的 Druid 连接池呢? 关于 Hikari 与 Druid 的那些事,有兴趣的可以这个 issue , 简单来说,各有所长。前者可以认为是个纯粹的数据库连接池,后者同时注重监控、可运维等能力扩展,且有阿里背书,经过大量验证. 1. 添加 Druid 依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.13</version> </dependency> 2. 移除 Hikari 依赖(可选)(建议移除) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> 关于 Druid 的一些配置,这里就不展开了。 借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

学习SpringBoot系列 -02- 多数据源

如何在SpringBoot工程中配置多数据源呢? 1. 排除掉自动引入的数据源相关配置 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class }) public class HelloJdbcApplication { public static void main(String[] args) { SpringApplication.run(HelloJdbcApplication.class, args); } } 2. 新增数据源配置信息 application.properties // 这里以H2演示,后面更新 foo.datasource.url=jdbc:h2:mem:foo foo.datasource.username=sa foo.datasource.password= bar.datasource.url=jdbc:h2:mem:bar bar.datasource.username=sa bar.datasource.password= 3. 新增数据源配置类 3.1 foo 数据源的配置类 @Configuration public class FooDataSourceConfiguration { @Bean @ConfigurationProperties("foo.datasource") public DataSourceProperties fooDataSourceProperties() { return new DataSourceProperties(); } @Bean public DataSource fooDataSource() { DataSourceProperties dataSourceProperties = fooDataSourceProperties(); return dataSourceProperties.initializeDataSourceBuilder().build(); } @Bean @Resource public PlatformTransactionManager fooTxManager(DataSource fooDataSource) { return new DataSourceTransactionManager(fooDataSource); } } 3.……

阅读全文

学习SpringBoot系列 -01- 移除parent依赖

借着极客时间的付费课程《玩转Spring全家桶》的机会,系统性的对Spring家族做些学习和了解。 如题,常常项目中会要求统一一个 parent 依赖,而SpringBoot工程默认的 parent 是 spring-boot-starter-parent ,那么如何移除掉这个依赖以便使用其他的parent呢?官方已经考虑到这个问题了,很简单,可以这么做: 1. 在 pom.xml 配置文件中,增加下面这段依赖(当前版本号最新是2.1.3,请根据实际需要进行更改) <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.1.3.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> 2. 在 pom.xml 配置文件中,更改 build 块的配置如下 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>2.1.3.RELEASE</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 如果你也有对这个课程的学习需求,可以通过此链接进行购买,我会得到极客的返利。……

阅读全文

挂PT方案 docker + deluge-flexget

剁手了一台低配独服,剁手了发现似乎并不能完全利用到,没有好的点子。除了硬盘大了一些外,一无是处,CPU垃圾、内存小、远在北欧,然而硬盘也是被使用了3w+小时的烂盘…… 作为独服,好处就是不用担心持续的高IO、高CPU占用了,23333 暂时没有好的利用的地方,刚好有个就放个PT吧,贡献点资源… 0. 创建普通用户 我比较喜欢用app这个普通用户来管理安装的应用 # useradd app # passwd app # usermod -a -G wheel app 1. 安装 // docker // 安装 # curl -fsSL https://get.docker.com/ | sh // 使app用户可以使用 $ sudo usermod -aG docker app // 启动 $ sudo systemctl start docker // 开启自启 $ sudo systemctl enable docker // n3mur1t0r/deluge-flexget // 拉镜像 $ docker pull n3mur1t0r/deluge-flexget // 创建容器 $ docker create --name deluge --net=host -e PUID=1001 -e PGID=1001 -e TZ=Europe/Paris -v /home/app/downloads:/downloads -v /home/app/deluge/config:/config n3mur1t0r/deluge-flexget // 启动 $ docker start deluge // 查看运行日志 $ docker logs deluge -f // 进入容器shell $ docker exec -it deluge /bin/bash 这个时候,访问http://SERVER_IP:8112 就可以打开webUI了(记得放行8112端口)。笔者不喜欢放行那么多的端口,就在前面加了nginx来实现代理。大致的配置如下:……

阅读全文

perl Setting locale failed, Please check that your locale settings

在Centos把shell改为zsh后,出现了下面这个waring信息,虽不影响使用,但看着实在是烦人. perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LC_CTYPE = "UTF-8", LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). 查了一些资料,可以通过在.zshrc中增加两行配置来解决这个问题 LC_CTYPE=en_US.UTF-8 LC_ALL=en_US.UTF-8 ……

阅读全文

zsh no matches found *

机器用的shell是zsh,在用acme.sh申请Let’s Encrypt通配符证书时,报了这么个错: zsh: no matches found: *.example.com 查了一下,对.zshrc增加下面一行配置即可 setopt no_nomatch ……

阅读全文