标识列
又称自增长列,不用手动插入,系统提供默认的序列值。
1.创建表时设置标识列
create table if exists tab_identity(
id int primary key auto_increment,
name varchar(20)
)
特点:
①标识列必须和一个key搭配,未必是主键;
②一个表最多只能有一个标识列;
③标识列的类型只能是数值型;
④标识列可以用set auto_increment_increment = 3;设置步长。
2.修改表时设置标识列
alter table tab_identity modify column id int primary key auto_increment;
3.修改表时删除标识列
alter table tab_identity modify column id;
事务
事务控制语言:TCL(Transaction Control Language)
事务:一个或者一组SQL语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。
回滚:撤销所有操作,回到数据的最初状态。
存储引擎:在MySQL中的数据用各种不同的技术存储在文件(或内存)中。show engines;来查看。
常用的存储引擎:MyISAM、innodb、memory
innodb支持事务,MyISAM、memory不支持事务。
事务的ACID属性
1.原子性(Atomicity)
事务是一个不可分割的工作单位,要么都发生,要么都失败。
2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态。
3.隔离性(Isolation)
事务执行不受其他事务干扰,并发执行的事务互不干扰。
4.持久性(Durability)
一个事务一旦提交,数据库的改变是永久性的。
事务的创建
隐式事务:事务没有明显的开启和结束的标记。
比如 insert、update、delete
显示事务:事务具有明显的开启和结束的标记。
前提:必须先设置自动提交功能为禁用
步骤1:开启事务
set autocommit=0;(只针对当前事务)
start transaction;(可选的,写不写都行)
步骤2:编写事务中的sql语句(select、insert、update、delete)
语句1;
语句2;
…
步骤3:结束事务
commit;提交事务
rollback;回滚
jdbc可进行试验
#开启事务
set autocommit =0;
start transaction;
#一组事务语句
update account set balance = 500 where id =1
update account set balance =1500 where id=3;
#结束事务
commit;
事务的并发
脏读:事务T1、T2,T1读取了已经被T2更新但还没提交的字段后,如果T2回滚,则T1读取的内容就是临时且无效的,
不可重复读:T1读取一字段后T2更新该字段,T1再查结果就不一样了。
幻读:T1读取一字段后T2插入新行,T1再读会多几行。
四种事务隔离级别
全局变量 @@tx_isolation mysql8.0后@@transaction_isolation
查看当前的隔离级别:select @@tx_isolation;
设置隔离级别:set session transaction isolation level serializable;
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | 是 | 是 | 是 |
read committed | 否 | 是 | 是 |
repeatable read | 否 | 否 | 是 |
serializable | 否 | 否 | 否 |
MySQL默认第三个隔离级别repeatable read
Oracle默认第二个隔离级别read committed
serializable效率很低,用默认的就可以。
回滚点演示(savepoint)
set autocommit=0;
start transaction;
delete from account where id= 25;
savepoint a;#设置保存点
delete from account where id= 25;
rollback to a;#回滚到保存点
学习整理于MySQL 基础+高级篇.