mysql数据库-事务篇

1.数据库事务的四大特性
1.1 原子性:事务是最小的执行单位,不能分割。事务的原子性确保动作要么全部完成,要么完全不起作用。
1.2 一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取结果相同。
1.3 隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发的事务之间数据库独立。
1.4 持久性:一个事务被提交后,它对数据库的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
1.5 脏读:某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作。则后一个事务所读数据就会是不正确的。
1.6不可重复读:在一个事务的两次查询中数据不一致,这可能是两次查询过程中插入了一个事务更新的原有数据。
1.7 幻读:在一个事务的两次查询中数据不一致,例如有一个事务查询了几列数据,而另一个事务却在此时插入了新数据,前一个事务在接下来的查询中,就会发现有几列数据它先前没有。
2.事务的隔离级别
数据库定义了4种不同的事务隔离级别,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
在这里插入图片描述
READ-UNCOMMITTED(读未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能导致脏读,幻读或者不可重复读。
READ-COMMITTED(读已提交):允许读取并发事务已提交的数据,可以防止脏读,但是幻读和不可重复还是有可能发生。
REPEATABLE-READ(可重复读):对同一字段多次读取的结果是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读有可能发生。
SERIALIZABLE(可串行化):最高隔离级别。完全服从ACID的隔离级别。所以事务依次执行,事务之间就完全不可能产生干扰,防止了脏读,不可重复读及幻读。
MYSQl默认的是REPEATALE_READ隔离级别Oracle默认采用的是READ_COMMITTED隔离级别。
事务隔离机制的实现基于锁机制和并发调度,其中并发调度使用的是MVVC.通过保存修改的旧版本信息来支持并发一致性读和回滚等特性。事务的隔离级别越低,请求的锁越少,所以大部分数据库系统的隔离级别都是READ-COMMITTED(读取已提交):但是你要知道的是InnoDB存储引擎默认使用REPEATANLE-READ(可重复读)并不会有任何性能损失。InnoDB存储引擎在分布式事务的情况下一般都会用到SERIALIZABLE(可串行化)隔离级别。
3.锁
3.1 当数据库有并发事务时,可能产生数据的不一致,这时候需要一些机制来保证访问的次序,锁机制就是这样的一个机制。
隔离级别与锁的关系:
READ-UNCOMMITTED级别下,读操作不需要加共享锁,这样就不会跟被修改的数据上的排他锁冲突。
READ-COMMITTED级别下,读操作需要加共享锁,但是在语句执行完以后释放共享锁;
REQEATABLE READ级别下,读操作需要加共享锁,但是事务提交前并不释放共享锁,也就是必须等事务执行完毕以后才释放共享锁。
SERIALLZABLE是限制性最强的隔离级别,因为该级别锁定整个范围的键,并一直持有锁,直到事务完成。
3.2 mysql的锁级别:按照颗粒度把数据库锁分为行级锁(InnoDB引擎),表级锁(MYISAM引擎)和叶级锁(BDB引擎)
行级锁:是mysql中锁定粒子最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突,加锁粒度最小,但是加锁开销也最大。行级锁分为共享锁和排他锁。特点:开销大,加锁慢;会出现死锁,锁定粒度最小,发生锁冲突的概率最低。并发度也最高。
表级锁:是mysql中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗少,被大部分Mysql引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。表级锁定分为表共享读锁(共享锁)和表独占写锁(排他锁)。特点:开销小,加锁快,不会出现死锁,锁定粒度大,发出冲突的概率最高,并发度最低。
页级锁:是mysql中锁定颗粒度介于行级和表级锁中间的一种锁。表级锁速度快,但是冲突多,行级冲突少,但速度慢。所以取了折中的页级,一次锁定相邻的一组记录。特点开销和加锁时间介于表锁和行锁之间,会出现死锁,锁定粒度介于表级和行锁之间,并发度一般
3.3 从锁的类别上讲,有共享锁和排他锁。
共享锁:也叫读锁,进行数据的读取时,对数据加上共享锁。可以同时加上多个。
排他锁:也叫写锁,进行数据的写入时,对数据加上排他锁。排他锁只能加一个,排他锁和其他排他锁,共享锁都相斥。
锁的粒度取决于存储引擎,InnoDB实现了行级锁,页级锁,表级锁。开销从大道小,并发能力也是从大到小。
3.4 INNODB引擎的行锁实现是基于索引来完成的。
INNODB存储引擎的锁的算法有三种:Record lock单个行记录上的锁;Gap lock间隙锁,锁定一个范围,包括记录本身。 Next-key lock Record+Gap锁定一个范围,包含记录本身,对于行的查询使用。
3.4 死锁:是指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环。
解决死锁的方法:1.如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表。可以大大降低死锁机会。2.在同一事务中,尽可能做到一次锁定所需要的所有资源,减少死锁的概率。3.对非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁的概率。如果业务处理不好,可以用分布式事务锁或者乐观锁。
乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性,在修改数据时把事务锁起来。通过version的方式进行锁定。
悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。在查询完数据的时候就吧事务锁起来,直到提交事务,通过数据库锁机制实现。
3.5 两种锁的使用场景:乐观锁适用于写少读多的情况下,即冲突很少发生,可以省去锁的开销,加大了系统的整个吞吐量。但如果多写的情况下,一般经常发生冲突,这导致上层应用会不断进行retry,这样反倒是降低了性能,所以一般多写的情况悲观锁比较适合。
4.视图
4.1 为了提高复杂SQL语句的复用性和表操作的安全性,mysql数据库管理系统提供了视图特性。
视图本质上是一种虚拟表,在物理上不存在,其内容与真实表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值形式存在,行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。
4.2 视图的特点:
1.视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。
2.视图是由基本表产生的虚表。
3.视图的建立和删除不影响基本表。
4.视图内容的更新(添加删除和修改)直接影响基本表。
5.当视图来自多个基本表时,不允许添加和删除数据。
4.3 视图的使用场景
视图的根本用途是简化sql查询,提高开发效率。如果说还有另一种用的话就是兼容老的表结构。
1.重用sql语句。2.简化复杂的sql操作,在编写查询后,可以方便的重用它而不必知道他的基本查询细节3.使用表的组成部分而不是整个表。保护数据,可以给用户授予表的特定部分的访问权限而不是整个表的访问权限。4.更改数据格式和表示,视图可返回与底层表的表示和格式不同的数据。
4.4视图的优点
1.查询简单化。视图能简化用户操作2.数据安全性。视图使用户能以多种角度看待同一数据,能够对机密数据提供安全保护3.逻辑数据独立性。视图对重构数据库提供了一定程度的逻辑独立性
4.5视图的缺点
1.性能。数据库必须把视图的查询转化成对基本表的查询,如果这个视图是由一个复杂的多表查询所定义,那么即使是 视图的一个简单查询,数据库也把它变成一个复杂的结合体,需要花费一定时间。
2.修改限制,当用户试图修改视图的某些行时,数据库必须把它转化为对基本表的某些行的修改。事实上,当从视图中插入或者删除时,情况也是这样。对于简单视图来说,这是很方便的,但是对于较为复杂的视图,可能不可修改,这些视图有如下特征:1.有UNIQUE等集合操作符的视图。2.GROUP BY 子句的视图。3.有AVG\SUM\MAX等聚合函数的视图,4.使用DISTINCT关键字的视图5.连接表的视图(其中有些例外)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值