事务控制语言 transaction control language
事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行要么全部不执行
存储引擎:
显示存储引擎SHOW ENGINES;
InnoDB 默认,支持事务
MyISM mysql5.5版本之前多用,不支持事务
MEMORY 多用,不支持事务
ACID
原子性(Atomicity):事务操作是一个不可分割的单位,事务操作要么都发生要么都不发生。
一致性(Consistency):事务必须使数据库从一个一致性状态到另一个一致性状态。
隔离性(Isolation):事务执行不受其他事务干扰(隔离级别)
持久性(Durability):一个事务一旦被提交,数据库的改变是永久的
事务创建
1、隐式事务:没有开启和结束标志
如insert、update、delete
2、显式事务
前提:设置自动提交功能禁用
步骤1:开启事务
set autocommit =0;当前回话有效
start transaction; 命令行可不写,禁用自动提交后自动执行
show variables like ‘autocommit’; 查看事务状态
步骤2:编写sql语句
语句1;
语句2;
。。。(select,insert,update,delete)
步骤3
commit;提交事务
rollback:回滚事务(出现异常使用,truncate删除后不能回滚)
隔离级别
没有隔离机制,会导致各种并发问题;
赃读
例如:两个事务T1,T2,T1读取了T2已经更新但是还没有提交的字段,T2回滚,T1再读取的事务结果不一样,之前读取的内容就是临时且无效的(可以扔掉的脏数据)
不可重复读
例如:两个事务T1,T2,T1从表中去读字段,T2更新后,T1再读,值不同
幻读
例如:两个事务T1,T2,T1读取后T2插入数据,T1再读出现了多几行
数据库四种隔离级别
read uncommitted 读未提交
read commit 读已提交
repeatable read 可重复读
serializable 串行化
Oracle支持两种事务隔离级别:read commit(默认)、serializable
Mysql支持四种事务隔离级别:repeatable read(默认)
命令行操作:
select @@tx_isolation; 查询隔离级别
set session transaction isolation level 隔离级别; 设置隔离级别
set name 字符集; 改变字符集
savepoint 别名:保存点,回滚到某点
read uncommitted:都不能避免
read commit:避免赃读
repeatable read:避免赃读,不可重复读
serializable:都避免