菜鸟学SQL之——TCL(事务控制)语言的学习(MySQL)

TCL语言的学习

TCL事务控制语言

事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。

引入:

张三丰有1000元,郭襄也有1000元,三丰要给郭襄转500元,这要执行两条语句,三丰钱-500,郭襄钱+500

update 表 set 三丰的余额=500 where name=‘张三丰’

这两条语句中间出现了意外,这时三丰的钱少了500,而郭襄的钱没有多。这500不翼而飞了,这时三丰用事务来解决

update 表 set 郭襄的余额=1500 where name = ‘郭襄’

事务的特性ACID

  • 原子性:一个事务不可再分割,要么都执行要么都不执行
  • 一致性:一个事务执行会使数据从一个一致状态切换到另一个一直状态
  • 隔离性:一个事务的执行不受其他事务的干扰
  • 持久性:一个事务一旦提交,则会永久的改变数据库的数据

事务的创建

隐式事务:事务没有明显的开启和结束的标记

比如一条insert、update、delete语句

显示事务:事务具有明显的开启或结束的标记

前提:必须先设置自动提交功能为禁用

set autocommit= 0;

步骤1:开启事务

set autocommit = 0;#写了这条语句就默认开启了事务
start transaction; #这条语句可选

步骤2:编写事务中的sql语句(select、insert、update、delete)

语句1;
语句2;
...

步骤3:结束事务

commit; #提交事务
或
rollback; #回滚事务
或
savepoint 节点名; #设置保存点

事务导致并发问题

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

  • 读脏数据:对于两个事务T1、T2,T1读取了已经被T2更新但没有提交的字段。之后,若T2回滚,T1再读取就读到的是原数据,T1刚才(T2更新但没提交时)读取的内容就是临时且无效的
  • 不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段且提交。之后,T1再次读取同一字段,值就不同了。
  • 幻读:对于两个事务T1、T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再次读取同一个表,就会多出几行

事务的隔离级别

脏读 不可重复读 幻读
read uncommitted
read committed 不会
repeatable read 不会 不会
serializable 不会 不会 不会

savepoint的使用

SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 25;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id = 29;
ROLLBACK TO a; #返回到保存点

猜你喜欢

转载自blog.csdn.net/ysf15609260848/article/details/104846750