分布式事务

事务的特性

原子性
要么全部执行成功,要么全部执行失败。

一致性
执行前后,数据始终处于一致的状态。

隔离性
两个事务之间互不干扰,事务a完成前,事务b不会读取事务a操作时的变化。

持久性
事务的操作会被持久化到数据库,并且不会被回滚。

事务的类型

扁平事务,带有保存点的扁平事务,链式事务,嵌套事务,

并发事务带来的问题

更新丢失(脏写),后者覆盖前者

脏读,一个事务读取了另一个事务未提交的数据

不可重复读,一个事务读取了某些数据,在一段时间后,这个事务再次读取之前读过的数据,此时数据被更改或删除了

幻读,一个事务按照相同的查询条件重新读取之前读过的数据,此时发现其他事务插入了满足当前事务查询条件的新数据。这是针对数据的插入。

##mysql中锁的分类
按性能:悲观锁、乐观锁(乐观锁是通过版本对比来实现的)
按操作类型:读锁,写锁(这两都是悲观锁)
读锁又称为共享锁或S锁(shared Lock)
写锁又锁为排他锁或L锁(Exclusive Lock)
按数据粒度:表锁,行锁,页面锁
按更细粒度:间隙锁、临键锁

死锁的必要条件(4个都满足,才会发生死锁)

1互拆条件
2不可剥夺条件
3请求与保持条件
4循环等待条件

处理死锁的方法

1预防死锁,破坏造成死锁的4个必要条件中的一个或多个,以防止死锁的发生。
2避免死锁,在资源分配中,使用策略防止系统进入不安全状态,从而避免死锁的发生。
3检测死锁
4解除死锁
在实际工作中,,通常采用有序资源分配法和银行家算法来避免死锁。
在mysql中,通常通过以下几种方式来避免死锁
1尽量让数据表中的数据检索都通过索引来完成,避免无效索引导致锁升级为表锁
2合理设计索引,尽量缩小锁的范围
3尽量减少查询条件的范围,尽量避免间隙锁或缩小间隙锁的范围
4尽量控制事务的大小,减少一次事务锁定的资源数量,缩短锁定资源的时间
5如果一条sql语句涉及事务加锁操作,则尽量将其放在整个事务的最后执行
6尽可能使用低级别的事务隔离机制

mysql事务的实现原理

mysql中事务的隔离性是由锁和MVCC机制实现的,原子性和持久性是由redo log实现的,一致性是由undo log实现的。
redo log是重做日志,提供前滚操作(binlog中有数据,commit),undo log是回滚日志,提供回滚操作。
redo log与binlog的区别
1binlog是mysql本身就拥有,而redolog是innodb特有的。
2两种日志记录的内容形式不同。MySQL的binlog是逻辑日志,其记录是对应的SQL语句。而innodb存储引擎层面的redolog日志是物理日志,保存了数据库中的值。
3两种日志记录写入磁盘的时间点不同,二进制日志只在事务提交完成后进行一次写入。而InnoDB 存储引擎的重做日志在事务进行中不断地被写入(不断地写入redo log buffer,不断地刷新)
4binlog不是循环使用,在写满或者重启之后,会生成新的binlog文件,redo log是循环使用。
5binlog可以作为恢复数据使用,主从复制搭建,redo log作为异常宕机或者介质故障后的数据恢复使用。
IMG_1421

xa

xa事务是一种基于两阶段提交和分布式事务。prepare,commit。

数据一致性问题

1.数据多副本场景
2.调用超时场景
3.缓存与数据库不一致场景
4.多个缓存节点数据不一致场景

分布式事务的理论知识