mysql事务详解

一、mysql事务的特征acid

原子性(Atomicity):一个事务的操作时原子性的,要么成功,要么事务中的都回滚、失败。
一致性(Consistency):事务提交后,业务数据状态要是一致的,比如转账操作,不能只扣款不入账。
隔离性(Isolation):事务之间的操作是隔离的,隔离又分为4个隔离级别
持久化(Durability):提交事务后,数据要持久化。

二、隔离的4个级别和事务的问题

  • Read uncommited
  • Read commited:oracle/mssql默认级别
  • Repeat read:mysql默认级别
  • Serializable
    4个级别重上到下安全性越来越高,但是并发性越来越低。

在事务中也会有3种问题出现:脏读,不可重复读和幻读
脏读:读取其他事务没有提交的数据。用read commit即可解决
不可重复读:在一个事务中,第一次读取数据,然后有其他事务修改此数据,再次读取结果数据改变,造成不可重复读问题。 用repeat read可解决
幻读:在一个事务中,第一次读取统计数据,然后有其他事务插入新的数据,再次读取统计数据,统计结果和之前不一样,即为幻读。用Serialal解决。

幻读和不可重复读的区别:不可重复读读到的是修改或删除的数据,而幻读读到的是新增的数据。所以2个隔离级别一样,数据库内部原理是行锁和表锁的区别。
Spring中提供事务传播和只读事务。

三、分布式事务

分布式事务是指对多个数据库进行操作,尤其在当今微服务架构下频繁出现,一个提交操作,可能会分布到不同的系统中,对应着不同的数据库;当然单系统出现分库时也会有这个问题。
简单说下分布式的原理,后面讲分布式还会详细介绍:
分布式CAP原理
C:数据一致性:即多个节点数据是一致的
A:可用性:即服务对外可用
P:分区容错性:多个节点,当出现某个节点宕机或者网络不通时,整个对外还是能服务的。

这3个特性一般分布式只能满足2个:
CP:数据强一致性,必须多个节点都写成功,才能成功。这是对数据一致性要求比较高的场景,比如数据库。
AP:可以容忍数据不一致性,但是必须是可用的。此场景针对查询服务或者展示信息服务,比如redis、微博等等。

而分布式事务采用base,最终一致性的特征
有几种实现方式:
分2段提交:先预提交,2个都没问题,再提交
消息中间件:先发生预提交到消息中间件,再发生提交信息到中间件。
补偿机制:try commit cancal 先提交本地,再提交远程,如果有异常,则调用cancal回滚远程服务

参考资料:
事务:https://my.oschina.net/huangyong/blog/160012?p=2
分布式事务:http://www.codeceo.com/article/distributed-transaction.html
https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html

你可能感兴趣的:(mysql)