Mysql基础学习(十)--- Mysql事务学习

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_40990836/article/details/101424288
Transaction Control Language 事务控制语言

事务:一个或一组sql语言组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务由单独单元的一个或者多个SQL语句组成,在这个单元中,每个MYSQL语句是相互依赖的,而整个单独单元作为一个不可分割的整体,如果单元中某条 SQL 语句一旦执行失败或者产生错误,整个单元将会回滚。所有受到影响的数据返回到事务开始以前的状态。如果单元中的所有SQL语句均执行成功,则事务则被顺利执行

案例: 转账

张三丰: 1000元
郭襄 : 1000元

UPDATE TABLE SET 张三丰的余额 = 500 WHERE name="张三丰";
# 意外
UPDATE TABLE SET 郭襄的余额 = 1500 WHERE name = "郭襄";
# 全部失败
Mysql 的存储引擎
  1. 在mysql中的数据用各种不同的技术存储在文件或者内存中。
  2. 通过show engines; 来查看mysql 支持的存储引擎
  3. 在mysql中使用最多的存储引擎: innodb, myisam ,memory , 其中 innodb 支持事务,而myisam 和 memory 不支持
事务的 ACID 属性
  1. 原子性(Atomicity)
    原子性是指事务是一个不可分割的工作单位,事务的操作要么都发生,要么都不发生。
  2. 一致性(COnsistency)
    事务必须使数据库从一个一致性状态变换到另外一个一致性状态
  3. 隔离性(Isolation)
    事务的隔离性是指一个事物的执行不能呗其他事务干扰,即一个事务内部操作及使用的数据对并发的其他事务时隔离的,并发执行的各个事务之间不能互相干扰
  4. 持久性(Durability)
    持久性是指一个事务一旦被提交,他对数据库中的数据的改变就是永久性的。接下来的其他操作和数据库故障不应该对其有任何影响
事务的创建

隐式事务: 事务没有明显的开启和结束的标记
比如: insert , update ,delete

显示事务: 事务具有明显的开始和结束的标记
前提: 必须先设置自动提交功能禁用

set autocommit = 0;

开启事务

set autocommit = 0;
start transaction; 可选的
# 编写事务中的sql 语句(SELECT , INSERT , UPDATE , DELETE )
语句 1,
语句 2,
。。。
# 结束实体
commit; # 提交事务
rollback; # 回滚事务

测试事务

use cbgk;
show tables;
SET AUTOCOMMIT = 0;
START transaction;
UPDATE asscount SET balance = 500 where username = '张无忌';
update asscount set balance = 1500 where username = '赵敏';
COMMIT;
select * from asscount ;
desc asscount;

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

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

数据库事务的隔离性: 数据库系统必须具备隔离并发运行各个事物的能力,使他们不会相互影响。避免各种并发问题。
一个事务与其他事务隔离的程度称为隔离级别,数据库规定了多种事务隔离级别。不同隔离级别对应不同的干扰程度。隔离级别越高,数据一致性越好。性能越弱

隔离级别

在这里插入图片描述

  1. 每启动一个mysql程序,就会单独获得一个数据库连接。每个数据库连接都有一个全局变量 @@tx_isolation, 表时当前的事务隔离级别。
  2. 查看当前的隔离级别: SELECT @@tx_isolation;
  3. 设置当前Mysql连接的隔离级别set transaction isolation level read committed;
  4. 设置数据库系统的全局的隔离级别: set global transaction level read committed;

事务的隔离级别

脏读 不可重复读 幻读
read uncommitted
read committed ×
repeatable read × ×
seriablizable × × ×
savepoint 的使用

演示 savepoint

set autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id = 25;
SAVEPOINT a; # 设置保存点
DELETE FROM account WHERE id = 28;
ROLLBACK TO a; ## 回滚到节点a

**执行完之后发现 id 25的被删除了。但是 id 28 的并没有被删除 **

猜你喜欢

转载自blog.csdn.net/qq_40990836/article/details/101424288
今日推荐