一、事务简介
TCL(Transaction Control Language):事务控制语言。
首先说说事务的概念。
1. 概念
事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
为什么要有事务?
案例:转账
张三丰 1000
郭襄 1000
updae 表 set 张三丰的余额=500 where name=‘张三丰’;
意外
updae 表 set 郭襄的余额=1500 where name=‘郭襄’;
2. 事务的ACID属性
(1)原子性:是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
(2)一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
(3)隔离性:一个事务的执行不受其他事务的干扰。
(4)持久性:一个事务一旦提交,那么它的改变是永久性的。
3.事务的分类
(1)隐式事务:事务没有明显的开启和结束的标记。
比如:insert、update、delete等。
(2)显式事务:事务具有明显的开启和结束的标记。
前提:必须设置自动提交的功能为禁用。
4.事务的使用步骤
(1)开启事务
set autocommit=0;
start TRANSACTION;(可选的)
(2)编写事务中的sql语句
语句1;
语句2;
。。。
(3)结束事务
commit:提交
rollback:回滚事务
案例演示:
第一步:开启事务
SET autocommit=0;
start TRANSACTION;
第二步:编写sql语句
update account set balance=1000 WHERE username='张无忌';
update account set balance=1000 WHERE username='赵敏';
第三步:结束事务
#commit;
ROLLBACK;
5.事务的隔离级别
(1)脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段。
之后,若T2回滚,T1读取的内容就是临时且无效的。
(2)不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段。
之后,T1再次读取同一个字段,值就不同了。
(3)幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行。
事务的隔离级别:
事务的隔离级别 | 脏读 | 不可重复读 | 幻读 |
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
oracle中默认第二个隔离级别 :read committed
**查看隔离级别**
select @@tx_isolation;
设置隔离级别
#注意:若为 session,表示只针对当前连接有效(即当前用户)。
若为global,表示全部有效。
set session|global transaction isolation level 隔离级别;