当前位置:   article > 正文

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

tcl语言教程菜鸟教程

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; #这条语句可选
  • 1
  • 2

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

语句1;
语句2;
...
  • 1
  • 2
  • 3

步骤3:结束事务

commit; #提交事务
或
rollback; #回滚事务
或
savepoint 节点名; #设置保存点
  • 1
  • 2
  • 3
  • 4
  • 5
事务导致并发问题

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

  • 读脏数据:对于两个事务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; #返回到保存点
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/187996
推荐阅读
相关标签
  

闽ICP备14008679号