MySQL-特性
一.事务
transaction事务
把多条sql语句视为一个整体执行,这些sql 要么都成功, 其中有一个失败了,之前的操作也需要撤销
MySQL中的事务控制
默认条件下,是一条语句一个事务,要多条语句一个事务,要通过‘begin’ ‘commit’ ‘rollback’来控制事务
格式
begin;//表示事务的起点,等价方式‘start transaction’
sql1;
sql2;
...
commit(提交,表示结果都生效); 或者rollback(回滚,用来撤销事务,都不生效);表示事务的终点
二.锁
(1)什么是锁
一个用户在修改数据时,另一个用户修改数据会处于阻塞状态
(2)分类
1.InnoDB 行级锁,只要两个客户端更新的是不同的行,互不干扰
2.MyISAM 表锁,锁住整个表
(3)应用
1.增删改都会在行上默认添加排他锁(X锁),表示其他用户不能增删改,但是可以查询;
2.查询可以添加共享锁,表示可以同时查询,但是其他用户不能修改,可以添加共享锁;
select * from 表 lock in share mode
3.查询时添加排他锁,别人不能再添加排他锁和共享锁
select * from 表 for update
mysql对查询有特别的优化:不用锁也能实现并发访问: 多版本并发访问(MVCC)
三.事务隔离性
有不同的隔离级别,
隔离级别越低,并发性越好,但数据的一致性差
隔离级别越高,并发性差,但数据的一致性高
由低到高四种:
读未提交 < 读提交 < 可重复读(mysql默认) < 序列化读
错误的级别由高到低
脏读 , 不可重复读, 幻读
(1)脏读
7369的工资1000
事务1 事务2
begin begin
修改7369的工资为8000
select * sal from emp where empno=7369;// 8000
rollback
将隔离级别提高到读提交
,可以避免脏读
(2)不可重复读
一边查询,另一边做update操作
一个事务内多次查询结果不一致
7369的工资1000
事务1 事务2
begin begin
select * sal from emp where empno=7369; // 1000
修改7369的工资为8000
commit;
select * sal from emp where empno=7369; // 8000
要避免脏读、不可重复读:将隔离级别提高到可重复读
隔离级别
(3)幻读
一边查询,另一边做insert操作
事务1 事务2
begin begin
查询到10,20,30,40条记录
insert 50号部门
commit
insert 50号部门 报错,主键冲突
要避免脏读、不可重复读、幻读:将隔离级别提高到序列化读
所谓的序列化读
就是把多版本并发退化到锁的并发控制:select语句上会被偷偷加上共享锁
四.事务四特性(ACID)
原子性 A 多个sql要作为一个整体运行,不可分割
一致性 C 一个事务内结果应当一致
隔离性 I
持久性 D 事务一旦提交,事务内的修改就应当永久生效
五.其他sql总结
查看有哪些库: show databases;
查看库的创建语句: show create database 库名;
使用库: use 库名;
查看有哪些表: show tables;
查看表结构: desc 表名;
查看建表语句: show create table 表名;
\G 可以取代; 效果是把表行转列
查看系统变量的值: select @@系统变量名;
select @@transaction_isolation; // 查看事务隔离级别
select @@port; // 查看服务器端口号
select @@character_set_server; // 查看默认字符集
select @@secure_file_priv;
…
show variables like ‘character%’;