java 数据库_java学习(数据库篇)

数据库

在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。

丢失修改:就是事务A 做了-10操作 然而 事物B在同时也做了-10操作 导致结果错误

不可重复读: 事务A 先读取了一条数据 但事物没结束,事物B对这条数据进行了修改,再次读取这条数据的时候,和第一次读取的数据不一样

读脏数据:事务T1修改某个数据并写回磁盘,事务T2读取同一数据,但T1由于某种原因撤销了,这时T1修改过的数据恢复原来的值,T2读取的数据就与数据库中的数据不一致。

幻读:事务A 对表A 的数据加10,事物B也是加10,事物A、B读取的数据不一样

隔离级别的实现

锁是一种最为常见的并发控制机制,在一个事务中,我们并不会将整个数据库都加锁,而是只会锁住那些需要访问的数据项, MySQL 和常见数据库中的锁都分为两种,共享锁(Shared)和互斥锁(Exclusive),前者也叫读锁,后者叫写锁。读锁保证了读操作可以并发执行,相互不会影响,而写锁保证了在更新数据库数据时不会有其他的事务访问或者更改同一条记录造成不可预知的问题。

时间戳

除了锁,另一种实现事务的隔离性的方式就是通过时间戳,使用这种方式实现事务的数据库,例如 PostgreSQL 会为每一条记录保留两个字段;读时间戳中包括了所有访问该记录的事务中的最大时间戳,而记录行的写时间戳中保存了将记录改到当前值的事务的时间戳。使用时间戳实现事务的隔离性时,往往都会使用乐观锁,先对数据进行修改,在写回时再去判断当前值,也就是时间戳是否改变过,如果没有改变过,就写入,否则,生成一个新的时间戳并再次更新数据,乐观锁其实并不是真正的锁机制,它只是一种思想,在这里并不会对它进行展开介绍。

并发控制

最为常见的三种并发控制机制:

悲观并发控制:悲观并发控制其实是最常见的并发控制机制,也就是锁

乐观并发控制:即乐观锁,乐观锁其实并不是一种真实存在的锁

多版本并发控制(MVCC):与前两者对立的命名不同,MVCC 可以与前两者中的任意一种机制结合使用,以提高数据库的读性能

mysql 索引

索引在MySQL中也叫做“键”或者"key"(primary key,unique key,还有一个index key),是存储引擎用于快速找到记录的一种数据结构

mysql索引结构分析

假定mysql的数据结构是二叉查找树(大的放右边,小的放左边),键值为索引值,data为存储在磁盘地址的指针,这样存在一种弊端,当索引值是递增的时候,二叉查找树显示出来的类似于链表的形式。

19fd92a7b8383185058585913d1c9a44.png

fc1cbbb9125fed243ecd9950377a71fb.png

cf1b9d16fdfaaf51b12251318854f1e8f11f7a05.jpeg?token=36d886cbcbc1fe41f6928c1a376d36d1

7dd98d1001e939010eb15c447fec31e136d1961b.jpeg?token=49825135d5fabc299ca25f1a4fea4a1d

bd17efbf86e58822ca2a79733c9ebde5.png

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值