MySQL常遇问题

MySQL事务与隔离级别

MySQL常遇问题

1,执行sql语句卡死,杀死sql进程

,在命令行执行sql语句后卡死,不返回结果。
	例子:
		执行 truncate, drop 命令时,因之前有其他操作命令导致数据表加表锁,后续命令无法执行
	解决:
		查看输入mysql执行进程列表
			show processList	
		将异常进程杀死
			kill kid [进程列表主键]

2,事务的特性

	,特性:
		原子性:事务最小的单位不允许分割,要么执行成功,要么执行失败。
		一致性:过程中若有执行失败的结果,则统一回滚【要通过全通过,否则反之】
		持久性:事务提交后修改的数据是持久的,不会因为故障收其影响
		隔离性:数据库并发时,事务内所操作的数据不会被另一事务所有修改

3,事务的隔离级别

	,隔离级别
		读取未提交【read uncommited】:最低的隔离级别,允许读取未提交的数据变更(开启事务后,未提交事务前,所修改的数据),可能造成 脏读,不可重复度,幻读
		读取已提交【read committed】:允许读取并发事务已经提交的数据,可避免脏读,可能造成 不可重复读,幻读
		可重复度【repeatable read】:对同一字段多次读取的结果都是一致的,除非本身事务修改,可避免脏读,不可重复读,可能造成 幻读
		序列化【serializable】:最高的隔离级别,完全服从ACID的隔离级别,依次按照事务的顺序进行执行
	,语法
		查看当前隔离级别 【默认为 repeatable read】
			show variables like '%tx_isolation%'
		修改事务隔离级别
			set session transaction isolation level   +隔离级别【read uncommitted】【当前会话】
			set global transaction isolation level   +隔离级别【read uncommitted】【系统】
	,各隔离级别的举例
		脏读:
			过程
				事务A,开启事务,修改表中id为1的记录,未提交事务
				事务B,开启事务,查询id为1的记录【此时的记录为事务A中修改的数据】,提交事务
			结果:
				造成脏读,原因事务B中获取到事务A中事务未提交的修改记录
		,不可重复读
			过程
				事务A,开启事务,查询id为1的记录,然后执行事务B,再次查询id为1的记录,未提交事务
				事务B,开启事务,修改id为1的记录,并提交事务
			结果
				执行事务B前与执行后查出的数据是不一致的。
		,幻读【与不可重读类似】
				事务A,开启事务,查询表中记录条数,然后执行事务B,再次查询表中记录条数,未提交事务
				事务B,开启事务,想表中添加记录数,并提交事务
			结果
				执行事务B前与执行后查出的数据是不一致的。

4,隔离级别详解

4.1,,隔离级别修改

	查看当前隔离级别 【默认为 repeatable read】
		show variables like '%tx_isolation%'
	修改事务隔离级别
		set session transaction isolation level   + 隔离级别【当前会话】
		set global transaction isolation level   + 隔离级别【系统】

4.2,,隔离级别现象模拟

4.2.1,读未提交【read uncommitted】【会产生 脏读,不可重复读,幻读】
    事务A·
事务A
    事务B
事务B

4.2.2,读已提交【read committed】【会产生 不可重复读,幻读】
    事务A·
事务A
    事务B
事务B
4.2.3,可重复读【repeatable read】【会产生 幻读】
    事务A·
在这里插入图片描述
    事务B
![在这里插入图片描述](https://img-blog.csdnimg.cn/b1823919a5b4472ebc44b2e24eb6ed6a.jpeg在这里插入图片描述

总结

参考文档

MySQL事务隔离级别

补录

  第一节,MySQL索引的使用及原理
  第二节,MySQL常用语法
  第三节,MySQL常遇问题

### MySQL 问题及解决方案 #### 1. 数据库连接失败 当尝试连接到 MySQL 数据库时,如果出现错误提示,可能是因为 URL 配置不正确。例如,URL 格式为 `jdbc:mysql://localhost:3306/course?characterEncoding=utf-8&useSSL=false&serverTimezone=GMT`[^1]。确保端口号、数据库名称和参数设置正确无误。 #### 2. 数据库权限不足 在连接 MySQL 数据库时,可能会到权限问题。例如,用户没有足够的权限访问特定数据库或表。可以通过以下命令授予用户权限: ```sql GRANT ALL PRIVILEGES ON testdb.* TO 'username'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES; ``` 这将赋予用户对指定数据库的所有权限[^2]。 #### 3. 数据库服务未启动 如果 MySQL 数据库服务未启动,客户端无法成功连接。可以通过以下命令检查服务状态并启动服务: ```bash # 检查 MySQL 服务状态 systemctl status mysql # 启动 MySQL 服务 systemctl start mysql ``` #### 4. 数据库备份失败 在执行数据库备份时,可能会到 `innobackupex: Error: mysql child process has died` 的错误信息[^3]。通这是因为系统中缺少 MySQL 客户端工具。可以通过安装 MySQL 客户端解决此问题: ```bash # 在基于 Debian 的系统上安装 MySQL 客户端 apt-get install mysql-client # 在基于 RedHat 的系统上安装 MySQL 客户端 yum install mysql ``` #### 5. 数据库字符集问题 如果数据库中的数据存在乱码问题,可能是由于字符集配置不一致引起的。可以在连接 URL 中添加字符集参数,如 `characterEncoding=utf-8`[^1]。此外,也可以通过以下命令修改数据库的默认字符集: ```sql ALTER DATABASE testdb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; ``` #### 6. 查询性能低下 查询性能低下可能是由于索引缺失或查询语句优化不足引起的。可以使用 `EXPLAIN` 关键字分析查询计划,并根据结果优化查询语句: ```sql EXPLAIN SELECT * FROM table_name WHERE column_name = 'value'; ``` #### 7. 服务器时间与客户端时间不一致 如果数据库服务器和客户端的时间不一致,可能会导致时间相关的操作出现问题。可以在连接 URL 中添加 `serverTimezone=GMT` 参数以指定服务器时区[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值