MySQL事务

关于为什么用分布式锁

如果现在项目是一个分布式系统,并且搭建了集群,那么使用Java的JVM级别的锁就不管用了,因为都不是同一台机器了,因为会分散在不同的JVM中无法保证一致性;

疑问?

看到这里你会问为什么我标题写的是分布式解决方案,却把MySQL事务在这里放了一份,原因很简单,我单纯想复习一下;

初步讲解

MySQL中的事务主要处理操作量大,复杂度高的数据。比如拿Github来说,你删除一个账号,你首先要删除个人信息,其次也得删除个人仓库等等,这些数据库操作语句就构成了一个事务;

基本了解

  • MySQL5.7以后使用了innodb数据库引擎来支持事务;那么之前用的是MyISAM;
  • 事务主要用来处理数据库的完整性,多条的操作性SQL语句要么全部执行,要么不执行;
  • 事务是专门用来管理insert、update、delete型操作语句;

ACID

A:原子性(不可分割性)

  • 原子性: 一个事务Transaction所有的操作,要么全部完成,要么全部失败;
  • 举例子: 假设我去买水果需要支付100块钱,老板需要收到100块钱,不可能我支付了100而老板却没有收到100;

C:一致性

  • 一致性: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏,保证了数据的正确性;
  • 举例子: 假设我去买水果,我微信余额总共200,老板说水果要100块钱,那么我支付了100以后微信余额就只有100了,而老板微信则多了100,这就表示一致性要符合逻辑运算;

I:隔离性

  • 举例子: 假设我去买水果我银行卡总共100块钱,我银行卡在支付的时候,有人给我卡里打了200块钱,那么别人给我打钱和我支付的操作并不影响我卡里最终的余额;也就是说别给我打钱和我支付的同时互不影响;

D:持久性

  • 持久性:事务结束后,对数据的修改在数据库里面是永久的,即使系统突然关机也没用;
  • 举例子:我买水果的时候微信余额100块钱,在支付的时候还没有输入支付密码手机就关机了,那么我手机重新开机微信余额还是100; 如果我当时输入了支付密码完成了付款,那么即使是我手机重新开机,我的余额也就是0了;

Java事务

解释

java系统需要操作数据库,则是使用JDBC来完成操作,事务的控制也就从MySQL转移到了Java程序代码中;

Java事务类型

JDBC事务

JDBC事务是通过Connection对象控制的; JDBC Connection接口提供了自动提交和手动提交;
java.sql.Connection提供的事务控制方法;

Java Transaction Api事务

请自行百度了解;

容器事务

请自行百度了解;

分布式事务

为什么会有分布式事务

单体应用被拆分成微服务应用,随着单个应用的模块被拆分成多个单独的应用(服务),可能部署在不同的服务器上面,分别使用了不同的数据源,业务操作需要调用三个服务来完成;此时每个服务内部的数据一致性都是服务本地的事务来处理的,但是全局的数据一致性没法保证;

那么如何解决分布式事务呢?

传送门: https://jiushiboy.top/post/20004.html

分布式ID生成方案

1.UUID

UUID是通用唯一标识码的缩写,目的是让分布式系统中所有的元素都有唯一辨识信息,而不需要通过中央控制器来指定唯一性;
优点: 1.因为不需要通过中央控制器判断唯一性所以直接生成就能用; 2.生成的主键全局唯一; 3.多个数据库的数据直接合并就行了不用担心重复;
缺点: 1.UUID占用16个字符,空间占用较多; 2.不是递增有序的数字;

2.数据库自增

MySQL数据库设置主键自动增长;
优点: 1.INT和BIGINT类型占用空间小; 2.主键自动增长,IO写入连续性好; 3.数字类型查询速度优先于字符串;
缺点: 1.并发性能不高,限于数据库性能; 2.分库分表需要改造,复杂; 3.自增:数据和数据量泄露;

3.Redis自增

Redis计数器,原子性自增
优点: 1.使用内存,并发性能好;
缺点: 2.数据丢失,如果突然宕机了呢; 2.自增:数据和数据量泄露;

4.雪花算法

分布式ID经典解决方案
雪花算法组成部分: 1.符位号,占用1位; 2.时间戳占用41位,可以支持69年时间跨度; 3.机器ID,占用10位; 4.序列号,占用12位,一毫秒可以生产4095个ID;
优点: 1.不依赖外部组件; 2.性能好;
缺点: 1.时间回拨;