事务(TCL)
事务的概述
概念
保证事务中的所有操作都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事务回滚(rollback)到最初状态。
事务的原理
事务开启之后, 所有的操作都会临时保存到事务日志, 事务日志只有在得到commit
命令才会同步到数据表中,其他任何情况都会清空事务日志(rollback也会断开连接)
事务的使用场景
如果在某个业务中需要执行多条SQL语句,那么此时一般是需要使用到事务,从而保证这多条SQL语句执行同时成功或同时失败。例如: 转账、批量删除、从购物车中提交订单等等操作
事务的四大特性(ACID)
1. 原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2. 一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3. 隔离性(Isolation)
事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
4. 持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响,一旦提交无法回滚
MYSQL进行事务管理操作
自动事务(mysql默认)
MySQL默认是自动提交事务的,一条sql语句就是一个事务
手动开启一个事务
方式一: 手动开启事务的方式
start transaction;
手动开启事务之后,执行的SQL语句都不会真正改变数据库中的数据,需要用户手动提交事务才能够真正执行SQL语句
(SQLyog中可能无法保证start后的语句与该事务开启语句在通过一个连接中而导致无法正常使用事务,在cmd中可以正常使用)
方式二: 设置MYSQL中的自动提交的参数【了解】
第一步: 查看MYSQL中事务是否自动提交
show variables like '%commit%';
第二步: 设置自动提交的参数为OFF
# 0:OFF 1:ON
set autocommit = 0;
提交和回滚事务
1. 提交事务
当这个事务中的SQL语句执行完毕之后,没有出现任何问题,那么我们需要在最后提交事务,让这些SQL语句真正执行去改变数据库中的数据
commit;
2. 回滚事务
当执行这个事务中的SQL语句的过程中,一旦出现问题或者异常,则需要回滚事务,从而回到SQL语句执行之前的状态
rollback;
回滚与提交都会导致事务结束
事务的隔离级别
不考虑事务的隔离性会引发的问题
事务在操作时的理想状态: 所有的事务之间保持隔离,互不影响。因为并发操作,多个用户同时访问同一个数据。可能引发并发访问的问题
事务隔离级别
可以通过设置事物隔离级别解决读的问题
事务四个隔离级别
级别 | 名字 | 隔离级别 | 脏读 | 不可重复读 | 幻读 | 数据库默认隔离级别 |
1 | 读未提交 | read uncommitted | 是 | 是 | 是 | |
2 | 读已提交 | read committed | 否 | 是 | 是 | Oracle |
3 | 可重复读 | repeatable read | 否 | 否 | 是 | MySQL |
4 | 串行化 | serializable | 否 | 否 | 否 | 最高的隔离级别 |
隔离级别越高,性能(效率)越差,安全性越高。
第四个开启之后就是 一个会话的事务操作只能等另一个会话的事务提交后才能继续进行
设置隔离级别
- 设置事务隔离级别
set session transaction isolation level 隔离级别;
eg: 设置事务隔离级别为read uncommitted
set session transaction isolation level read uncommitted;
- 查询当前事务隔离级别
select @@tx_isolation;
DCL语句
我们现在默认使用的都是root用户,超级管理员,拥有全部的权限。但是,一个公司里面的数据库服务器上面可能同时运行着很多个项目的数据库。所以,我们应该可以根据不同的项目建立不同的用户,分配不同的权限来管理和维护数据库。
创建用户
CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';
关键字说明:
用户名
:将创建的用户名
2. `主机名`:指定该用户在哪个主机上可以登陆,如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
-
密码
:该用户的登陆密码,密码可以为空,如果为空则l该用户可以不需要密码登陆服务器
具体操作:
-- user1用户只能在localhost这个IP登录mysql服务器
CREATE USER 'user1'@'localhost' IDENTIFIED BY '123';
-- user2用户可以在任何电脑上登录mysql服务器
CREATE USER 'user2'@'%' IDENTIFIED BY '123';
授权用户
用户创建之后,基本没什么权限!需要给用户授权
授权格式:GRANT 权限1, 权限2... ON 数据库名.表名 TO '用户名'@'主机名';
关键字说明:
1. GRANT
授权关键字
2. 授予用户的权限,如SELECT
,INSERT
,UPDATE
等。如果要授予所的权限则使用ALL
3. 数据库名.表名
:该用户可以操作哪个数据库的哪些表。如果要授予该用户对所有数据库和表的相应操作权限则可用*表示,如*.*
4. '用户名'@'主机名'
: 给哪个用户授权
具体操作:
- 给user1用户分配对test这个数据库操作的权限
GRANT CREATE,ALTER,DROP,INSERT,UPDATE,DELETE,SELECT ON test.* TO 'user1'@'localhost';
撤销授权
REVOKE 权限1, 权限2... ON 数据库.表名 FROM '用户名'@'主机名';
具体操作:
- 撤销user1用户对test操作的权限
REVOKE ALL ON test.* FROM 'user1'@'localhost';
查看权限
SHOW GRANTS FOR '用户名'@'主机名';
具体操作:
- 查看user1用户的权限
SHOW GRANTS FOR 'user1'@'localhost';
删除用户
DROP USER '用户名'@'主机名';
具体操作:
- 删除user2
DROP USER 'user2'@'%';
4.6 修改用户密码
4.6.1 修改管理员密码
mysqladmin -uroot -p password 新密码 -- 新密码不需要加上引号
注意:需要在未登陆MySQL的情况下操作。
具体操作:
mysqladmin -uroot -p password root
输入老密码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r850Grfd-1643421863482)(image/DCL08.png)]
4.6.2 修改普通用户密码
set password for '用户名'@'主机名' = password('新密码');
注意:需要在登陆MySQL的情况下操作。
具体操作:
`set password for 'user1'@'localhost' = password('666666');`
🌹写在最后💖:路漫漫其修远兮,吾将上下而求索!伙伴们,再见!🌹🌹🌹