mysql复习第十六天:事务

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lw305993897/article/details/102716259

1、什么是事务

一个或者多个sql语句组成一个执行单元,这个执行单元要么全部执行要么全部不执行;

  • 举个例子

a转给b50元
从a减去50,然后b增加50;
在事务的支持下有2种结果
1、操作成功:a减少50,b增加50;
2、操作失败:a,b2个账号没有变化;
如果没有事务的支持,可能出现错:a账户减少了50,此时系统挂了,导致b账户没有加上50,而a账户凭空少了50;

2、事务的特点

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

3、事务操作

3.1、隐式事务

mysql中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务;
是否开启隐式事务由autocommit(value为on表示隐式提交)变量控制;

show variables like 'autocommit';

在这里插入图片描述

3.2、显示事务

事务需要手动开启、提交或回滚,由开发者自己控制;
表数据:
在这里插入图片描述

  • 提交事务
# 设置显示事物
SET autocommit=0;
# 开启事务
START TRANSACTION;
# sql语句(select,insert,update,delete)
UPDATE account SET money = money-50 WHERE NAME ='张三';
UPDATE account SET money = money+50 WHERE NAME ='李四';
# 结束事务
COMMIT;# 提交事务
  • 操作之后:
    在这里插入图片描述
  • 回滚事务
# 设置显示事物
SET autocommit=0;
# 开启事务
START TRANSACTION;
# sql语句(select,insert,update,delete)
UPDATE account SET money = money-50 WHERE NAME ='张三';
UPDATE account SET money = money+50 WHERE NAME ='李四';
# 结束事务
ROLLBACK;# 回滚事务
  • 操作结果(没有变化)
    在这里插入图片描述

3.3、只读事务

表示在事务中执行的是一些只读操作,如查询,但是不会做insert、update、delete操作;

# 设置显示事物
SET autocommit=0;
# 开启只读事务
START TRANSACTION READ only;
# sql语句(select,insert,update,delete)
UPDATE account SET money = money-50 WHERE NAME ='张三';
UPDATE account SET money = money+50 WHERE NAME ='李四';
# 结束事务
ROLLBACK;# 回滚事务
  • 报错
    在这里插入图片描述

4、事务隔离级别

查看隔离级别

SELECT @@tx_isolation;

在这里插入图片描述

设置隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

读未提交:READ-UNCOMMITTED
读已提交:READ-COMMITTED
可重复读:REPEATABLE-READ
串行:SERIALIZABLE

4.1、 Read uncommitted(读未提交)

如果一个事务已经开始写数据,则另外一个事务不允许同时进行写操作,但允许其他事务读此行数据,该隔离级别可以通过“排他写锁”,但是不排斥读线程实现。这样就避免了更新丢失,却可能出现脏读,也就是说事务B读取到了事务A未提交的数据

  • 解决了更新丢失,但还是可能会出现脏读

4.2、Read committed(读提交)

如果是一个读事务(线程),则允许其他事务读写,如果是写事务将会禁止其他事务访问该行数据,该隔离级别避免了脏读,但是可能出现不可重复读。事务A事先读取了数据,事务B紧接着更新了数据,并提交了事务,而事务A再次读取该数据时,数据已经发生了改变。

  • 解决了更新丢失和脏读问题

4.3、Repeatable read(可重复读取)

可重复读取是指在一个事务内,多次读同一个数据,在这个事务还没结束时,其他事务不能访问该数
据(包括了读写),这样就可以在同一个事务内两次读到的数据是一样的

  • 解决了更新丢失、脏读、不可重复读、但是还会出现幻读

4.4、Serializable(可序化)

提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行,如果仅仅通过“行级锁”是无法实现序列化的,必须通过其他机制保证新插入的数据不会被执行查询操作的事务访问到。序列化是最高的事务隔离级别,同时代价也是最高的,性能很低,一般很少使用,在该级别下,事务顺序执行,不仅可以避免脏读、不可重复读,还避免了幻读

  • 解决了更新丢失、脏读、不可重复读、幻读(虚读)

猜你喜欢

转载自blog.csdn.net/lw305993897/article/details/102716259