MySQL 事务操作

如果一个包含多个步骤的业务操作被事务管理,那么这些操作要么同时成功,要么同时失败。

事务执行是一个整体,所有 SQL 语句都必须执行成功。如果有一条 SQL 语句出现异常,则所有的 SQL 语句都要回滚,整个业务执行失败。

操作语句

开启事务:START TRANSACTION;

回滚事务:ROLLBACK;

提交事务:COMMIT;

事务提交方式:

  • MySQL 数据库中事务默认自动提交,SELECT @@autocommit;
  • 开启事务后,需要手动提交
  • 修改事务提交方式:SET @@autocommit = 0; — 1 代表自动提交,0 代表手动提交

事务的四大特征

特征 描述
原子性 是不可分隔的最小操作单位,要么同时成功,要么同时失败
持久性 当事务提交或回滚后,数据库会持久化的保存数据
隔离性 多个事务之间是隔离的,彼此相互独立
一致性 事务操作前后,数据总量保持不变

事务的隔离级别

存在问题

存在问题 描述
脏读 一个事务,读取到另一个事务中没有提交的数据
不可重复读 在同一个事务中,两次读取到的数据不一样
幻读 一个事务操作数据表中所有记录,另一事务添加数据,则第一个事务查询不到添加修改

隔离级别

隔离级别从小到大安全性越来越高,但是效率越来越低。

查询数据库隔离级别:SELECT @@tx_isolation;

设置当前 MySQL 连接的隔离级别:SET TRANSACTION ISOLATION LEVEL level_field;

设置数据库系统全局的隔离级别:SET GLOBAL TRANSACTION ISOLATION LEVEL 级别字符串;

隔离级别 描述
READ UNCOMMITTED 读未提交;产生问题:脏读,不可重复读,幻读
READ COMMITTED 读已提交;产生问题:不可重复读,幻读
REPEATABLE READ(默认) 可重复读;产生问题:幻读
SERIALIZABLE 串行化;可以解决所有问题

DCL 管理用户,授权

管理用户

添加用户

  • CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';

删除用户

  • DROP USER 'username'@'hostname';

修改用户

  • UPDATE USER SET PASSWORD = PASSWORD('new_password') WHERE USER = 'username';
  • SET PASSWORD FOR 'username'@'hostname' = PASSWORD(new_password);

查询用户

  • 切换到 mysql 数据库:USE mysql;
  • 查询 user 表:SELECT * FROM user; % — 代表任意主机都可以访问

忘记 MySQL 密码?

  • 停止 mysql 服务
  • 使用无验证方式启动 mysql 服务:mysqld --skip-grant-tables;
  • 打开新的 CMD 窗口,直接输入 mysql 命令 + 回车,可以登录成功;修改 root 密码 并重启 mysql 服务。

授权管理

查看权限

  • SHOW GRANTS FOR 'username'@'hostname';

授予权限

  • GRANT auth1,auth2,... ON database.table TO 'username'@'hostname';
  • 授予 ROOT 权限:GRANT ALL ON *.* TO 'username'@'hostname';

撤销权限

  • REVOKE auth1,auth2,... ON database.table FROM 'username'@'hostname';