浅谈OLTP与OLAP及事务操作


今天在讲OLTP和OLAP应用的时候被问到关于事务的问题,因为事务问题是OLTP和OLAP的很大的一个区别,关于这个问题其实理解起来很难,需要不断的反复记忆,这里再列出几个串联知识点供大家参考。

1. OLTP与OLAP的应用和区别?

OLTP:

应用:联机事务处理,满足业务数据的存储。
 特点:数据量相对较少,需要满足事务。
 工具:  关系型数据库管理工具,例如MySQLOracle

OLAP:

   应用:联机分析处理,满足基于数据处理的数据分析、存储和管理。
     特点:数据量相对较大,性能相对较慢,没有事务性需求
     工具:数据仓库管理工具,例如Hive

2.事务

事务:指的是逻辑上的一组操作(sql语句),组成这组操作的各个逻辑单元(sql),所有的操作必须成功完成,否则在每个操作中所作的更改都会被撤销,也就是事务的原子性,要么全部成功,要么全部失败。
开启事务  start transaction;
提交事务 commit;
开启事务 start transaction;
事务的结束有两种,当事务中的所有操作全部成功执行时,食物提交,结束;当其中一个步骤失败,将发生会滚,撤销到事务开始前;

3.事务的ACID四大特性:

1.	原子性(Atomicity):事务是数据库的逻辑工作单位,事务中包含的操作要么全部成功,要么全部失败。
2.	一致性:(Consistence):事务执行的结果必须是使数据库从给一个一致性状态变到另一个一致性状态。
因此当数据库只包含成功事务提交的结果时,就说数据库出于一致性状态;如果数据库运行中发生故障,有些事
务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已经写入物理数据库,这时数据库就出于
一种不正确的状态,或者说不一致的状态。
3.	隔离性(Isolation):一个事务的执行不能被其他事务干扰,即同一个事务内部的操作及使用的数据对
其他并发事务是隔离的。
4.	持续性(Durability):也称永久性,指一个事务一旦提交,他对数据库的数据改变就是永久性的。接
下来的其他操作或故障不应该对其执行结果有任何影响。
并发事务导致的故障问题

4.并发访问问题

 1. 脏读:脏读是指在一个事务处理过程里读取了另一个事务未提交的数据;
例如小明的银行卡余额里有100元。现在他打算用手机点一个外卖饮料,需要付款10元。但是这个时候,他的
女朋友看中了一件衣服95元,她正在使用小明的银行卡付款。于是小明在付款的时候,程序后台读取到他的余
额只有5块钱了,根本不够10元,所以系统拒绝了他的交易,告诉余额不足。但是小明的女朋友最后因为密码
错误,无法进行交易。小明非常郁闷,明明银行卡里还有100元,怎么会余额不足呢?(他女朋友更郁闷。。。)
  2.幻读/虚读:一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成
两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。
例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一
行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,
会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
  3.不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该
数据,两次结果相异,不可被信任。
例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就
得到了不同的结果,发送了不可重复读。

5.数据库事务的隔离级别

Read uncommitted(最低级别,任何情况都无法保证。)
Read committed(可避免脏读的发生。)
Repeatable read(可避免脏读、不可重复读的发生。)

6.如何解决并发问题?

隔离级别: 解决问题
set session transaction isolation level serializable ;
数据库规范规定了4种隔离级别,分别用于描述两个事务并发的所有情况。
read uncommitted 读未提交,一个事务读到另一个事务没有提交的数据。
a)	存在:3个问题(脏读、不可重复读、虚读)。
b)	解决:0个问题
read committed 读已提交,一个事务读到另一个事务已经提交的数据。(oracle默认隔离级别)
a)	存在:2个问题(不可重复读、虚读)。
b)	解决:1个问题(脏读)
repeatable read:可重复读,在一个事务中读到的数据始终保持一致,无论另一个事务是否提交。(mysql默认隔离级别)
a)	存在:1个问题(虚读)。
b)	解决:2个问题(脏读、不可重复读)
serializable 串行化,同时只能执行一个事务,相当于事务中的单线程。
a)	存在:0个问题。
b)	解决:3个问题(脏读、不可重复读、虚读)
安全和性能对比
安全性:serializable > repeatable read > read committed > read uncommitted
性能 : serializable < repeatable read < read committed < read uncommitted
常见数据库的默认隔离级别:
MySql:repeatable read
Oracle:read committed
大部分情况下我们会更多的关注效率(不要用银行抬杠),有问题出现的时候再去解决,一般不会为了(不会发生重大事故的)安全
去牺牲效率。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值