1.ACID
⑴ 原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,不可拆分的一体,这和前面两篇博客介绍事务的功能是一样的概念,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
⑵ 一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
⑶ 隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。
⑷ 持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
1,脏读(我读到了你未提交事物的数据)
脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。
2,不可重复读(再一个事物中,我第一次读你没修改,第二次读你修改提交了)
不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。
3,幻读
我把表中的所有1改为2,还没提交,然后你查进了一条数据1并提交,然后我就产生幻觉了,怎么肥死,有一个1没有变成2.
幻读和不可重复读的区别就是,不可重复查询的是同一个数据项,而幻读确是一批数据。
现在来看看MySQL数据库为我们提供的四种隔离级别:
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
默认② Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
2.数据库索引的实现原理
数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树及其变种B+树。
索引就是一个满足特定查找算法的数据结构,指向数据。
代价:1.存储空间 2.插入修改数据的话 索引也要变,花时间
优点:1.数据唯一性 2.加快数据查询 3.加快分组和排序 4.加快表连接
可以加索引的列:1.经常搜索的 2.主键 3.经常用于连接的外键,加快连接
不该用的列:1.查的很少 2.数据值很少(男女)
索引类型:
1.唯一索引
不允许索引值重复,比如姓名
2.主键索引
唯一索引的特定类型,数据库自动为主键创建索引
3.聚集索引
索引值的逻辑顺序规定其物理顺序,主键自动聚集索引,且唯一。
书本的分类为逻辑顺序,书本的摆放为物理顺序,逻辑分类决定了物理摆放位置(分类摆放)
局部性原理与磁盘预读
局部性原理就是,当一个数据要被使用事,通常附近的数据也要被使用,程序运行时所需数据集中。
磁盘所以为了提高I/O效率(本来磁盘很慢,读取效率是主存 的几百分之一),所以每次预读一页或者几页
页是存储器的逻辑块(通常4k)
数据库索引为什么要用 B+ 树而不用红黑树呢?
索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数 每次预读页的倍数
B-/B+树刚好满足,子节点多,存的元素多,红黑树就2个子节点,浪费空间。
B-/B+树的深度低,所以i/o次数少。
3.数据库的锁
锁包括行级锁、表级锁、悲观锁、乐观锁
行级锁:一种它锁,防止另外事务修改此行
表级锁:行共享 (ROW SHARE) 行排他(ROW EXCLUSIVE) 共享锁(SHARE) 共享行排他(SHARE ROW EXCLUSIVE) 排他(EXCLUSIVE)
悲观锁:
事务每次去操作数据的时候都假设有其他事务会修改需要访问的数据,每次我都有人跟我抢!
所以我要求在操作之前先上锁,实现靠数据库的锁机制
乐观锁:
每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型
4.聚簇索引和非聚簇索引
5.数据库的三级封锁协议
基本的封锁类型有两种:
排它锁(Exclusive locks 简记为X锁)写锁
共享锁(Share locks 简记为S锁)读锁
1 级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
2级封锁协议是:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。2级封锁协议除防止了丢失修改,还可进一步防止读"脏"数据。
3级封锁协议是:1级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。3级封锁协议除防止了丢失修改和不读'脏'数据外,还进一步防止了不可重复读。
6.MyISAM与InnoDB区别及选择
选择:
因为MyISAM相对简单所以在效率上要优于InnoDB.如果系统读多,写少。对原子性要求低。那么MyISAM最好的选择。且MyISAM恢复速度快。可直接用备份覆盖恢复。
如果系统读少,写多的时候,尤其是并发写入高的时候。InnoDB就是首选了。
两种类型都有自己优缺点,选择那个完全要看自己的实际类弄。