mysql事务

事务(Transaction):

事务是应用程序中一系列严密的操作(事务是用来管理insert、update、delete基本指令的),所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。

提交(commit):事务中包含的操作,必须提交以后才能执行,否则只是一个计划列表。
回滚(rollback):撤销已经执行成功的操作。

事务具有四个特征(ACID):

原子性(Atomicity) 要么全部执行、要么全部不执行
一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态
隔离性(Isolation) 并发执行的各个事务之间不能互相干扰
持续性(Durability) 事务成功执行后,事务的所有操作对数据库的更新是永久的

事务并发遇到的问题:
脏读:事务A读取了事务B更新的数据,然后事务B在某些因素下执行了回滚,那么事务A读取的数据就是不合理的,即脏数据。
不可重复读:事务A在事务B修改并提交的前后读取同一条数据的值得不一样的,具有不可重复读问题。
幻读:事务A在事务B删除并提交前后读取的数据一样,出现了幻读。

原因是因为并发执行的事务之间没有隔离,各自不具有独立性。

MySql 的四种事务隔离级别:

Read Uncommitted(读未提交) 什么都不解决
Read Committed(读已提交) 解决脏读
Repeatable Read(可重读) 默认,解决脏读和可重复读
Serializable(串行化) 全解决
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

Spring 中使用事务:
1. 配置 TransactionManager 统一管理事务(springboot 中自动配置)
2. 在涉及多个数据库更新操作的 service 层方法上增加 @Transactional 注解,
默认碰到 RuntimeException 就进行回滚,可以通过 rollbackFor 进行配置

  import org.springframework.transaction.annotation.Transactional;
  @Transactional(rollbackFor = Exception.class)

spring 中事务传播行为:
在方法中调用一个支持事务的方法,会对当前方法产生什么样的影响

PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,就新建一个事务

分布式事务:
程序间的事务,多个程序间的多个操作要么都成功,要么都失败
分布式事务框架:TX-LCN https://www.txlcn.org/zh-cn/docs/preface.html
支持三种事务模式:LCN,TCC,TXC

分布式系统的 CAP 理论:一致性(Consistency),可用性(Availability),分区容忍性(PartitionTolerance)
分布式系统都无法同时满足 CAP 三个要求,只会选择性的实现其中的两个

分布式锁:
在分布式的部署环境下,通过锁机制来让多客户端互斥的对共享资源进行访问
排他,避免死锁,高可用
常见分布式锁:数据库锁(乐观/悲观),redis,zookeeper
最常用的是 redis:单线程,使用简单,效率高

你可能感兴趣的:(数据库操作)