【MySQL】事务的隔离级别

一、事务简介

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 × × ×
mysql中默认第三个隔离级别 :repeatable read
oracle中默认第二个隔离级别 :read committed

**查看隔离级别**
select @@tx_isolation;

设置隔离级别

#注意:若为 session,表示只针对当前连接有效(即当前用户)。
若为global,表示全部有效。
set session|global transaction isolation level 隔离级别;

猜你喜欢

转载自blog.csdn.net/renjingjingya0429/article/details/88368689