小言_互联网的博客

mysql:TCL事务控制语言

487人阅读  评论(0)


TCL(transaction control language):事务控制语言。事务指一个或者一组sql语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。

一.事务的分类

隐式事务:事务没有明显的开启和结束的标记,eg:insert、update、delete语句
显示事务:事务具有明显的开启和结束的标记,premise:必须先设置自动提交功能为禁用 set autocommit = 0;

二.事务的属性

♥事务的属性:acid
1.atomicity:原子性:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
2.consistency:一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。
3.isolation:隔离性:一个事务的执行不能被其他事务干扰。
4.durability:持久性:一个事务一旦被提交,它对数据库中数据的改变就是永久性的。

三.事务的创建

语法:

step1.开启事务 :
	set autocommit = 0;
	[start transaction;]

step2.编写事务中的sql语句:
(select insert update delete)

step3.结束事务:
	commit;#提交事务
	rollback (to savepoint的名字);#回滚事务

1.创建

#创建一个事务,向idol_id中插入一行新记录
SET autocommit = 0; 
start transaction;#step1
INSERT INTO idol_id VALUES(4,'lyf'); #step2
COMMIT; #step3

2.rollback

#查看rollback的效果:把id为4的name该成'hjy'
SET autocommit = 0;
start transaction;
UPDATE idol_id SET NAME='hjy' WHERE id = 4;
ROLLBACK;
SELECT * FROM idol_id; #由于回滚(rollback),所以name并不会被修改

3.节点

#查看savepoint的作用:先把id为4的name改成'hjy',设为节点a;在插入一条新记录,设为节点b
SET autocommit = 0;
start transaction;
UPDATE idol_id SET NAME='hjy' WHERE id = 4;
SAVEPOINT a;
INSERT INTO idol_id VALUES(5,'xwz');
SAVEPOINT b;
ROLLBACK TO a;
SELECT * FROM idol_id;
#从下面的截图可以看出,节点a之前的内容都被执行了,节点a之后的内容没有被执行。
#也就是说,rollback to 哪个节点,那么就执行到哪个节点。

4.delete和truncate在事务中的区别

delete 可以回滚,truncate不能

SET autocommit=0;
START TRANSACTION;
DELETE FROM idol_id;
ROLLBACK;
SELECT * FROM idol_id;

SET autocommit=0;
START TRANSACTION;
TRUNCATE idol_id;
ROLLBACK;
SELECT * FROM idol_id;

四.事务的隔离级别

查看当前事务隔离级别: select @@tx_isolation;
设置当前mysql连接的隔离级别:set session|global transaction isolation level XXX;

♥并发问题:
	脏读:T1读取了已经被T2更新但还没被提交的字段,若T2回滚,那么T1读取的内容就是临时且无效的。
	(顺序:T2更新——T1读取——T2回滚,那么T1读取的内容就是脏读数据)
	
	不可重复读:T1读取了一个字段,T2更新了该字段,若T1再次读取这个字段,那么值就不一样了。
	(顺序:T1读取——T2更新——T1读取,T1前后两次读取的内容不一样)
	
	幻读:T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,若T1再次读取,就会多出几行。
	(顺序:T1读取——T2插入新数据——T1读取,T1前后两次读取的数据总量不一样)


♥事务隔离级别:
	read uncommitted:脏读、不可重复读、幻读
	read committed:不可重复读、幻读
	repeatable read:幻读
	serializable:没有并发问题
	mysql中默认为:repeatable read
	Oracle默认为:read committed

为了方便演示,以下操作在两个客户端进行,分别代表了事务1和事务2(灰底是事务2)

1.脏读

首先要在两个客户端重新设置以下隔离级别:

set global transaction isolation level read uncommitted;

t2更新:

t1读取:

t2回滚:

t1再读取时,内容就和之前不一样了:

2.不可重复读

t1先读取:

t2更新并提交:

t1再读,就和之前的内容不一样了

3.幻读

t1读:

t2插入新记录,并提交

t1再读,读取的记录数量就和之前不一样了:


转载:https://blog.csdn.net/weixin_41391619/article/details/105111410
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场