mysql高级-索引和事务

本文详细介绍了数据库中的索引作用,强调其在加快数据查找速度方面的重要性。接着,讨论了事务的基本概念,及其在确保数据完整性中的关键角色。文章还列举了事务并发可能出现的脏读、不可重复读和幻读问题,并阐述了四种不同的事务隔离级别,以及它们如何解决这些问题。此外,锁的概念被提出,作为防止并发冲突的手段。最后,展示了如何在MySQL中创建、查看和删除索引,以及事务的开启、回滚和隔离级别设置的示例。
摘要由CSDN通过智能技术生成

第一章 索引、事务和锁
1、 索引有什么作用?
存储引擎用于快速找到记录的一种数据结构,相当于字典的音序表,可以快速查某个字。
2、 事务有什么作用?
为了完成对数据的操作,企业应用经常要求并发访问在多个构件之间共享的数据。这些应用在下列条件下应该维护数据的完整性
3、 事务的并发问题有哪些?如何处理?
脏读:脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
不可重复读:是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

  1. 读未提交(Read uncommitted)
    一个事务可以读取另一个事务未提交的修改。是最低的隔离级别。
  2. 读已提交(Read committed)
    一个事务只能读取另一个事务已提交的修改。该级别可以解决脏读问题。
  3. 可重复读(Repeatable read)
    事务开始读取数据时不允许其他事务对这些数据进行修改。保证了同一事务多次读取同样的记录结果一致。该级别可以解决不可重复读的问题,但不能完全解决幻读问题。
  4. 可串行化(Serializable)
    最该级别的事务隔离级别。强制事务串行执行,可以解决脏读、不可重复读、幻读问题,但效率低下,通常不使用这种方式。
    4、 锁的作用是什么?
    简单说,就是lock table,不让别人动
    1、主要有两种:锁分共享锁和排它锁
    共享锁时,别人能读,不能改变量表数据。s
    排它锁时,别人既不能读,也不能改表数据。
    笔记:创建索引
    create index myindex on mytable(username(16));
    alter table mytable add index myindex(username);
    查看索引
    show index from mytable;
    删除索引
    drop index myindex on mytable;
    事务:
    Create table t_act(
    Actno int primary key,
    Balance int
    )
    手动开启事务,向 t_act 表中插入一行记录,回滚事务。代码如下所示:
    start transaction;-- 手动开启事务
    insert into t_act values(4,200); – 更新操作
    rollback;-- 回滚事

    select * from t_act;
    2、事务的隔离级别
    事务的隔离级别有 4 个:
     读未提交(read uncommitted):事务 A 和事务 B,事务 A 未提交的数据,事务 B 可以读取到,这里读
    取到的数据叫做“脏数据”。这种隔离级别最低,一般是在理论上存在,数据库隔离级别一般都高于该
    级别;
     读已提交(read committed):事务 A 和事务 B,事务 A 提交的数据,事务 B 才能读取到。这种隔离级
    别高于读未提交,可以避免“脏数据”。但如果事务 A 多次读取同一数据,而事务 B 在事务 A 多次读
    取的过程中,对数据作了更新并提交,导致事务 A 多次读取同一数据时,结果不一致,这种现象称为“不
    可重复读”;
     可重复读(repeatable read):事务 A 和事务 B,事务 A 提交之后的数据,事务 B 读不到事务 A 提交
    的数据。这种隔离级别高于读已提交,但如果事务 A 在修改数据的过程中(比如将所有记录状态设为 1),
    如果事务 B 向同一张表中插入一条新记录(状态为 0),事务 A 提交后再次查询表,会发现有一条记录
    状态没有改成 1,好像发生了幻觉,这种现象称为“幻读”。可重复读是 MySQL 默认隔离级别;
     串行化(serializable):事务 A 和事务 B,事务 A 在操作数据库时,事务 B 只能排队等待。这种级别
    可以避免“幻读”,每一次读取的都是数据库中真实存在数据,事务 A 与事务 B 串行,而不并发。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值