1. 事务
DDL create alter drop truncate
DML insert update delete select
TCL start transaction, commit, rollback
1) start transaction 开始事务 (begin)
2) commit 提交事务
3) rollback 回滚事务
账户表account
ID balance(余额)
1 50000.0
2 0.0
create table account (
id int primary key,
balance decimal(12,2) not null
);
insert into account(id,balance)values(1,50000.0),(2,0.0);
以下两条sql必须作为一个整体执行, 要么都成功,其中有一条失败,前面成功的也得撤销
update account set balance=balance+10000.0 where id=2; /*2号账户转入10000元*/ 成功
update account set balance=balance-10000.0 where id=1; /*1号账户转出10000元*/
所谓的事务,就是指一个事务内,多条sql语句是作为一个整体执行的。
一个事务内的多条sql是作为一个原子操作,不可以被分割。要么都成功,要么都不成功。
start TRANSACTION;
UPDATE
UPDATE
INSERT
DELETE
如果这个事务内多条sql全部成功 COMMIT(让更改都生效)
如果这个事务内有sql失败了,Rollback(让更改都撤销)
事务内所有更改,在结束之前,对于其它用户来讲都是不可见的。
事务commit提交时,这些更改才会真正生效,其它用户才能看到你的更改。
事务执行中如果出现意外情况,这时候可以执行rollback,可以撤销事务内所有更改,恢复到事务开始的时刻
commit 和rollback都意味着事务结束
事务有四大特性
ACID
A 原子性, 指事务内多条sql是作为一个整体执行
C 一致性, 事务开始前后,整个数据的状态应当一致
I 隔离性, 指事务的隔离级别(未提交读,提交读,可重复读,序列化读)
1) 脏读(读取到了未提交的数据)
客户1 客户2
1 号账户余额 10000.0
begin;
update 1 号账户余额50000.0
select 1 号账户余额 50000.0 脏读
rollback;
select 1 号账户余额 50000.0
2)避免脏读现象, 将隔离级别升级为提交读
查询到的肯定是别人提交后的结果,提交读下不会有脏读, 但会有不可重复读现象:
客户1 更新 客户2查询
1 号账户余额 10000.0
begin;
select ... 10000.0
begin;
update 1 号账户余额50000.0;
commit;
select ... 50000.0
commit;
3) 为了避免不可重复和脏读的现象,可以将隔离级别升级可重复读(mysql默认隔离级别)
4) 幻读 (可以将隔离级别提高为序列化读,即可避免幻读现象)
客户1 新增 客户2查询
原始记录是10条
begin begin;
查询个数 10
insert 1
commit;
查询个数 11
commit;
5) mysql的【可重复读】隔离级别三种现象都可以避免
D 持久性, 事务中做的更改必须在事务结束后永久生效
增删改查(insert update delete select)
CRUD c insert 插入
r select 查询
u update 更新
d delete 删除
2. DCL 数据控制语言 (了解)
grant 授权
revoke 回收权限
create user 'user1'@'localhost' identified by 'user1';
登录之后执行use test3;
会报告 Access denied for user 'user1' 含义是用户无权访问.
使用root 给user1授权
grant all on test3.* to 'user1'@'localhost';
all 是代表所有权限:select,insert,update,delete...
test3.* 是权限的范围:test3库中所有对象
to 后面跟的是用户
使用root回收权限
revoke all on test3.* from 'user1'@'localhost';
更细的权限分配
grant select on test3.student to 'user1'@'localhost'; /*只让test1用户能够查询test3.student表*/