本篇文章主要总结SQL语句中的DCL语句、事务和锁
一、DCL语句(了解)
主要由grant和revoke两个关键字完成:grant 授权 revoke 回收权限
1、创建用户
create user 用户名 identified by '密码';
2、授权语法:
grant 权限 to 用户名;
例如:把查询test库中所有表的查询权限授权给user1
grant select on test.* to user1;
3、回收权限
revoke 权限 from 用户名;
例如:回收之前分配的权限:
revoke select on test.* from user1;
二、事务
对于任何数据库应用而言,事务是非常重要的,事务是保证底层数据完整的重要手段,没有事务支持的数据库应用,那将非常脆弱。
1、事务控制语句
主要由commit、rollback和savepoint三个关键字完成
transaction 事务 : 把多条sql语句视为一个整体执行,这些sql 要么都成功, 其中有一个失败了,之前的操作也需要撤销
两个人同时操作一张表的同一条数据
中国银行账户表 account
id name balance(余额)
1 张三 2000
建设银行账户
id name balance(余额)
2 张三 3000
张三转账
try {
begin;
update account set balance=balance+1000 where id = 2;
// 出现异常
update account set balance=balance-1000 where id = 1;
commit;
} catch( Exception e ) {
rollback;
}
2、mysql的事务控制
默认情况下,是一条语句一个事务
要多条语句一个事务,需要通过 begin
commit
rollback
来控制事务
a.begin; // 表示事务的起点 等价方式: start transaction
sql1
sql2
b.commit(提交,表示结果都将生效) 和 rollback(回滚,用来撤销事务内的更改) 表示事务的终点;
c.除此之外,MySQL还提供了savepoint来设置事务的中间点,通过使用savepoint设置事务的中间点可以让事务回滚到指定中间点,而不是回滚全部事务;
如下设置了一个中间点:
savepoint a;
回滚到设置的中间点:
rollback to a;
注意: 普通的提交、回滚都会结束当前事务,但回滚到指定中间点因为依然处在事务之中,所以不会结束当前事务。
三、锁(了解)
InnoDB 行级锁, 只要两个客户端更新的是不同的行,互不干扰
MyISAM 表锁,是锁住整个表
增删改(insert update delete) 都会在行上加排他锁(X锁)
查询可以加共享锁 (S锁)表示可以同时查询,但其他人不能增删改(insert update delete)
select * from 表 lock in share mode; 添加共享锁-别人可以再加共享锁,但不能再加排他锁
查询时加排他锁
select * from 表 for update; 添加排他锁, -别人不能再加共享锁和排他锁
mysql对查询有特别的优化:不用锁也能实现并发访问: 多版本并发访问(MVCC)
查询
1 张三 8000 旧版本
修改
1 张三 7000
select * from 表 就是利用的多版本并发查询, 好处:并发性高!
java.util.concurrent.CopyOnWriteArrayList 线程安全的ArrayList: 修改时会产生一个集合的副本,修改都是在副本上进行,查询查的是旧集合的内容,所以查询和修改可以并行执行,等修改结束会用副本替换旧的内容
线程安全的List: Vector 全部方法加锁
四、事务隔离性(了解)
有不同的隔离级别,
隔离级别越低,并发性越好,但数据的一致性差
隔离级别越高,并发性差,但数据的一致性高
由低到高四种:
读未提交 < 读提交 < 可重复读(mysql默认) < 序列化读
错误的级别由高到低
脏读 , 不可重复读, 幻读
五、事务四特性 (ACID)
原子性(Atomicity) A 事务是应用中最小的执行单位,就如原子是自然界的最小颗粒。多个sql要作为一个整体运行,不可分割。
一致性(Consistency) C 事务执行的结果必须使数据库从一个一致性状态到另一个一致性状态。一个事务内结果应当一致。
隔离性(Isolation) I 各个事务的执行互不干扰。
持久性(Durability) D 也称为持续性,指事务一旦提交,事务内的修改就应当永久生效,通常就是保存进物理数据库。
六、其他sql总结 (了解)
查看有哪些库: show databases;
查看库的创建语句: show create database 库名;
使用库: use 库名;
查看有哪些表: show tables;
查看表结构: desc 表名;
查看建表语句: show create table 表名;
\G 可以取代; 效果是把表行转列
查看系统变量的值: select @@系统变量名;