一.事物
1.事物是并发控制的基本单位。所谓的事物,是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。事物是数据库维护数据一致性的基本单位,在每个事物结束时,都能保持数据一致性。
2.事物的四个特性(ACID)
原子性(Atomicity):事物中的所有元素作为一个整体提交和回滚,事物是一个完整操作
一致性(Consistemcy):事物的执行使得数据库从一种正确的状态转换成另一种正确的状态。也就是说一个事物执行之前和执行之后都必须处于一致性状态。
(例如A和B转账,假设用户A和用户B两者的钱加起来是5000,那么不管A和B之间如何转账,转账几次,事物结束后两个用户的钱加起来还是5000)
隔离性(Isolation):在事物正确提交之前,不允许把该事物对数据的更改提供给任何其他事物。
持久性(Durability):事物正确提交后,其结果将永久保存在数据库中,即使在事物提交后有了其他故障,事物的处理结果也会得到保存。
3.一个数据库事物通常包含了一个序列对数据库的读/写操作。包含有下面两个目的:
为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致的方法。
当多个应用程序并发访问数据库时,可以在这些应用程序提供一个隔离方法,以防止彼此的操作相互干扰。
4.事物的隔离级别
在数据库操作中,为了有效保证并发读取数据的正确性,提出的事物的隔离级别
InnoDB存储引擎提供事物的隔离级别
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
这些隔离级别的区别如下:
脏读:一个事物读到另一个事物未提交的数据
例如:A向B转账,A执行了转账语句,但A还没有提交事物,B读取数据,发现自己账户钱变多了(A回滚事物,当B再查看时并没有变多)
不可重复读:(在同一事物中,两次读取同一数据,得到的内容不同)一个事物读取到另外一个事物已经提交的数据,即一个事物看到其他事物所做的修改。
(A查询数据库得到的数据,B去修改数据库的数据,导致A多次查询数据库的结果不一致)
幻读:是指一个事物内读取到别一个事物插入的数据,导致前后读取不一致。
二.索引
在关系型数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构;索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引就是提升查找速度的一种手段。
索引的原理:对要查询的字段建立索引就是把该字段按照一定的方式排序;建立的索引只对该字段有用,如果查询的字段改变,那么索引也就无效了,比如图书馆的书是按照书名第一个字母排序的,那么你想要找作者叫张三的就不能使用索引了;还有就是索引太多会降低查询的速度;
DB在执行一条SQL语句的时候,默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜素结果集合。如果我们对某一字段增加索引,在查询的时候就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。
不加索引的情况:
1.如果每次都需要取到所有表记录,无论如何都必须进行全表扫描了;
2.对非唯一的字段,例如“性别”这种大量重复值的字段,
3.对于记录比较少的表,增加索引不会带来速度的优化反而浪费了存储空间,因为索引需要存储空间
索引的优点
1.通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性;
2.可以大大加快数据的检索速度;
3.可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义;
4.在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间;
5.通过使用索引,可以在查询的过程中使用优化隐藏器,提高系统的性能。
索引的缺点
1.创建和维护索引需要耗费时间,这种时间随着数据量的增加而增加
2.索引需要占物理空间,除了数据表占数据空间外,每一个索引还要占一定的物理空间,如果要占用聚簇索引,那么需要的空间会更大。
3.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,因此降低了数据的维护速度。
三.数据库的乐观锁和悲观锁
1.乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反了数据的完整性;(在修改数据的时候把事物先锁起来,通过version的方式来锁定;实现方式:使用version版本或时间戳)
2.悲观锁:先取锁再访问,假定会发生并发冲突,屏蔽掉一切可能违反数据完整性的操作;(在查询完数据的时候把事物先锁起来,直到提交事物;实现方式使用数据库中的锁机制)
数据库的完整性:指数据库中数据在逻辑上的一致性、正确性 、有效性和相容性;