1、Mysql事务的四大特性(ACID)是什么
(1)、原子性(Atomicity):一个事务必须被事务不可分割的最小工作单元,整个操作要么全部成功,要么全部失败,一般就是通过commit和rollback来控制。
例子:假设A给B转账,账户 A 减少一定金额并增加到账户 B。如果在转账过程中出现任何错误(如网络中断),整个事务将被回滚,确保账户 A 和账户 B 的余额保持不变。
(2)、一致性(Consistency): 数据库总能从一个一致性的状态转换到另一个一致性的状态。
例子:假设A给B转账,转账前A和B的钱一共为10000,转账后A和B的钱还是为10000。
(3)、隔离性(Isolation): 一个事务相对于另一个事务是隔离的,一个事务所做的修改是在最终提交以前,对其他事务是不可见的。
(4)、持久性(Durability): 一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。
2、分别解释下脏读、不可重复读、幻读
脏读: 事务中的修改即使没有提交,其他事务也能看见,事务可以读到未提交的数据称为脏读。
不可重复读 :在一个事务中多次读取同一数据可能会得到不同的结果,因为其他事务可能在此期间修改并提交了这些数据。(前后多次读取,不能读到相同的数据内容)
幻读 :在一个事务中执行相同的查询两次,可能会看到不同的行集,因为其他事务插入或删除了数据。
不可重复读和幻读的区别是:前者是一行数据或几行数据发生变化,后者是查询结果集的行数发生变化。
3、常见的隔离级别由低到高有哪几种
读未提交:一个事务可以读取另一个事务尚未提交的数据,事务读到未提交的数据称为脏读。
读已提交:一个事务只能读取已经提交的数据。但可能会出现不可重复读的情况,即同一个事务内两次读取相同的数据,结果却不同,因为在这两次读取之间另一个事务修改并提交了数据。
可重复读(mysql默认的事务隔离级别):一个事务内的多次读取操作会看到同样的数据行,即使其他事务在此期间对这些数据进行了修改和提交。这意味着可以防止脏读和不可重复读,但可能存在幻读,即当两个查询的结果集由于其他事务插入新的行而有所不同。
序列化:这是最高的隔离级别,在该级别下,事务完全隔离,如同它们以某种顺序一个接一个地执行一样。它可以防止所有并发引起的问题,包括脏读、不可重复读和幻读。
4、mysql的存储引擎 innodb和myisam有什么区别
MySQL 5.5以上的版本默认是InnoDB,5.5之前默认存储引擎是MyISAM。
对于事务:innodb支持;myisam不支持。
对于锁粒度:innodb是行锁定机制,适合高并发;myisam是表锁定机制,不适合高并发。
对于是否支持外键:innodb支持外键;myisam不支持外键。
适合场景:innodb读写均衡,适合写大于读场景,需要事务的场景;myisam读多写少场景,不需要事务。
5、select、where、from、group by、having、order by的执行顺序
- from :从哪个表查询
- where: 初步过滤条件
- group by:过滤后进行分组(重点)
- having: 对分组后的数据进行二次过滤(重点)
- select: 查看哪些结果字段
- order by: 按照怎样的顺序进行排序返回(重点)
6、MySQL中的varchar和char有什么区别
varchar和 char是两种不同的字符串数据类型,varchar(len) 和char(len)中, len参数存储的是字符长度。
char类型:长度固定,存储字符,插入的长度小于定义长度时,则用空格填充,存取速度比varchar快得多,适合存储很短的,固定长度的字符串,如手机号,MD5值等。
varchar类型:长度可变,存储字符,小于定义长度时,按实际插入长度存储,存取速度比char慢得多,适合用在长度不固定场景,如收货地址,邮箱地址等。
7、常用的数据库时间类型字段有哪些
DATE类型:格式为 ’YYYY-MM-DD',
适用场景:只需要记录日期而不需要时间时使用,例如生日、注册日期等。
TIME类型:格式为 ’HH:MM:SS',
适用场景:需要单独记录时间的情况,比如会议开始时间、任务持续时间等。
DATETIME类型:格式为’YYYY-MM-DD HH:MM:SS',
适用场景:需要精确到秒级别的日期和时间戳时使用,例如订单创建时间、文章发布时间等。
TIMESTAMP类型:格式为’YYYY-MM-DD HH:MM:SS',
适用场景:适合需要跨时区操作的数据,如用户活动记录、登录时间等。
8、MySQL中的datetime和timestamp有什么区别
datetime类型:以 ’YYYY-MM-DD HH:MM:SS'
格式表示,使用8个字节来存储年、月、日、时、分、秒的信息,它的范围是1000-01-01 00:00:00到 9999-12-31 23:59:59,它直接存储用户输入的值,不受时区影响。
timestamp类型:以 'YYYY-MM-DD HH:MM:SS'
格式表示,但是只用4个字节存储,它的范围是1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC之间的时间戳。它将值转换为协调世界时(UTC)进行存储,并在检索时根据本地时区转换回原始时间。