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
查看评论