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