mysql

本文详细介绍了MySQL数据库的常用操作,包括登录、查看数据库、创建与选择数据库、查看表、插入记录、删除表与数据库,以及用户权限设置。重点讲解了事务隔离级别,特别是可重复读的实现机制,通过多版本并发控制(MVCC)解决并发问题和幻读现象。还深入探讨了加锁策略,包括行锁和间隙锁在并发写和防止幻读中的应用。
摘要由CSDN通过智能技术生成

1、登录mysql数据库

mysql -u 用户名 -p

回车后输入密码。

2、查看数据库

show databases;

3、创建数据库

create database 数据库名称;

4、选择访客特定数据库

use database名字;

5、查看数据库中所有表

show tables;

6、查看数据库表结构

describe table名。

7、向自增ID的表插入记录

方法一:insert into 表名 (name,date) values(‘张三’,‘‘1970-12-11’);//除自增ID外的其他字段都赋值

方法二:insert into 表名values(0或null,‘张三’,‘‘1970-12-11’)//自增ID的值赋予0或null。

8、删除表

drop table 表名;

9、删除数据库

drop database 数据库名;

10、增加mysql用户

grant select,insert,delete,update on 数据库.* to 用户名@登录主机 identified by "密码"

(1)允许新增用户在任意机器访问数据库,执行被授权的操作

grant select,insert,delete,update on 数据库.* to 用户名1@“%” identified by "密码”;

(2)仅允许新增用户在特定机器访问数据库,执行被授权的操作

grant select,insert,delete,update on 数据库.* to 用户名2@localhost identified by "密码”;//这里的特定机器是本机

11、设置隔离级别

set global transaction isolation level read committed;//读提交

12、mysql如何实现事务隔离

(1)读未提交,相当于没有隔离,没有加锁。

(2)串行化,读的时候加共享锁,其他事务也可并发读,但是不能写。写的时候加排他锁,其他事务不能并发读也不能并发写。

读提交和可重复读,这2种比较复杂。

MySql采用的是可重复读的隔离级别,为了实现可重复读,MySql通过多版本并发控制(MVVC)机制来实现。

具体来讲,每行记录有1到多个版本,每行记录除了自身数据之外,还有一个版本号的字段,记row trx_id。这个字段就是产生事务的ID,transaction id,它在事务开始时向事务系统申请,按时间先后顺序递增。

图片源自:https://www.cnblogs.com/fengzheng/p/12557762.html,包括下面的思想也源自该链接。

可重复读的隔离策略下,事务开始的时候会生成全局性快照,而读提交的策略下则每次读都会生成一次快照,这是可重复读和不可重复读的关键。

对于一个快照而言,它可以读取的数据遵循以下原则:

1、当前事务内的更新,可以读到。

2、版本未提交,不能读到。

3、版本已提交,但是在快照生成后提交的,不能读到。

4、版本已提交,但是在快照生成前提交的,可以读到。

并发写的实现:

两个事务,同时对一条数据进行修改,最终结果应该是时间靠后的那个。并且更新,要读取当前版本(也就是时间最新的那个版本),然后再更新。

加锁的过程要分有索引和无索引两种情况。

update userTable set age=3 where id = 11

id是userTable的主键,是有索引的情况。mysql就是直接根据索引对这行数据并加锁。

update userTable set age=11 where age=10

对于上述sql,age不是主键,没有为age设置索引,属于没有索引的情况。mysql无法直接定位到这行数据,mysql会对所有行加锁,然后会过滤掉不满足的行,被释放的行不加锁。

解决幻读:

MySql在可重复读的隔离级别下解决幻读的问题。

并发写的问题,通过锁来解决;幻读的问题,也是通过锁,这个锁叫间隙锁,MySql把行锁和间隙锁合并在一起,解决了并发写和幻读的问题,简称Next-Key锁。

假设现在表中有两条记录,并且 age 字段已经添加了索引,两条记录 age 的值分别为 10 和 30。

此时,在数据库中会为索引维护一套B+树,用来快速定位行记录。B+索引树是有序的,所以会把这张表的索引分割成几个区间。

如图所示,分成了3 个区间,(负无穷,10]、(10,30]、(30,正无穷],在这3个区间是可以加间隙锁的。

之后,我用下面的两个事务演示一下加锁过程。

在事务A提交之前,事务B的插入操作只能等待,这就是间隙锁起得作用。当事务A执行update user set name='风筝2号’ where age = 10; 的时候,由于条件 where age = 10 ,数据库不仅在 age =10 的行上添加了行锁,而且在这条记录的两边,也就是(负无穷,10]、(10,30]这两个区间加了间隙锁,从而导致事务B插入操作无法完成,只能等待事务A提交。不仅插入 age = 10 的记录需要等待事务A提交,age<10、10<age<30 的记录页无法完成,而大于等于30的记录则不受影响,这足以解决幻读问题了。

这是有索引的情况,如果 age 不是索引列,那么数据库会为整个表加上间隙锁。所以,如果是没有索引的话,不管 age 是否大于等于30,都要等待事务A提交才可以成功插入。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值