事务总结

目录

 

单机版事务

特点ACID

隔离性引发的思考

脏读

不可重复读

幻读

隔离级别

传统的4个隔离级别

拍照隔离级别

事务调优原则

分布式事务

网络


单机版事务

特点ACID

原子性:一个事务的操作过程中,要不全部成功,要不全部不成功。保证能看到系统成的更改。

一致性:数据库在事务前后状态一致,比如。A和B一共有5000块钱,他们之间相互进行转账,加起来也总数还是5000。

隔离性:数据库为每个用户开启的事务是并行的,A事务要不再B事务之前执行,要不再B事务之后执行。本质:以性能为理由对一致性的破坏。

隔离性引发的思考

隔离性希望开启并行的事务,其实都是围绕:读读、写写、读写、写读可否并行的问题展开。为了解决下面的问题,上世纪是通过读写锁分离来做到的,人类追求性能和速度的目标是无限的,在读写锁又扩展了U锁的概念用于解决读写会发生的问题(读写锁会占有资源并排他,很容易造成死锁问题,所以U锁可以预判断事务先读后写的特性,将整个资源锁起来)。本质上只有俩种锁:排他锁和共享锁。

脏读

本质:写读,再写的过程中被读取。

A银行转B。执行2个update,一个-100,一个加100.当一个执行了,B查询发现少了100,然后不管第二个执行没,第一个没有commit的话,整个应该都回滚。此时B当时读到的就是假的。

不可重复读

本质:读写,再读的过程中被写。

A事务读取俩次,中间间隔有B事务做了修改,导致A事务俩次读的不一致。

幻读

写发生了并行,且事务之前没有感知。

当修改一条数据1变成2的时候,忽然有一个线程过来进行了插入1的操作,最后一看还有1,好像刚才修改没有发生过一样。

持久化:事务对数据库的操作,是持久化到硬盘的。

 

隔离级别

传统的4个隔离级别

oracle和大多数的数据库默认的隔离级别:Read Committed, oracle只支持(repeatable Read和Serializable)

mysql支持:repeatable read的隔离级别 InnDB

现在的数据库包括oracle还是mysql采用的都是:

拍照隔离级别

解决了读写造成的不可重复读,还有写写并发的事务相互感知。

实现方式:1、快照SNAPSHOT ISOLATION

                  2、多版本控制MVCC;  oracle---scn,mysql---Trx_id(InnoDB引擎),每次写的时候+1进行版本控制。保证读的时候能读对应的版本。目标:单位时间内只有一个事务再操作资源数据。

事务回滚:乐观的版本:让低版本的并发更新回滚。

核心是copy on write 无锁编程。适合读写比率高,写比读成本更高。

 

事务调优原则

1、减少锁的覆盖范围

2、增加锁上可并行的线程数

3、选择正确的锁类型

操作系统个层面的角度看,选择哪种锁是通过并发争抢的程度来决定选择,如果是并发争抢严重,选择乐观锁。

悲观锁:线程进入blocking,有换入换出。

乐观锁:

本质上的类型:排他锁和共享锁。

扩展的类型:读写锁。一般会考虑:数据被读锁占用的时候,其他读锁是也可以访问数据,但是写锁过来的时候,会升级写锁比变成排他锁。这样会因为读写的事务之间形成死锁(互相占有资源不释放,从操作系统层面的死锁会有4个线程的特征:1、互斥2、持有并等待 3、无抢占4、循环等待)

分布式事务

分布式需要解决:异常,因为会出现断点等故障的可能性比单机会大的多。机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的TCP、存储数据丢失、其他异常等等...

 

目标:1、能像传统单机事务一样进行操作

            2、无限扩展

网络

网络可以帮助实现2。

带给我们好处:

  • 去中心化
  • 无限的扩展性
  • 安全性

带给我们需要解决问题:

1、节点之间的共享-----通过服务器之间的消息传递来实现。

2、网络的延迟

3、确定性丧失----网络的丢包造成,需要考虑用更加完善的协议来做到。 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值