首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >mysql的事务与锁

mysql的事务与锁

作者头像
一写代码就开心
发布于 2022-05-28 09:33:41
发布于 2022-05-28 09:33:41
7150
举报
文章被收录于专栏:java和pythonjava和python

目录

1 事务

1.1 事务特性

事务的基本要素(ACID)

1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。

2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏 。比如A向B转账,不可能A扣了钱,B却没收到。

3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。

1.2 隔离级别

因为有多个事务,各个事务之间有没有影响呢?所以就有了隔离级别。

而且不同的隔离级别,是有不同的问题。 遇到的问题就是:

mysql默认的事务隔离级别为repeatable-read;

1.3 实战解释各个级别遇到的问题

我们先创建一个表:

1.3.1 查询当前数据库的隔离级别

代码语言:javascript
复制
select @@tx_isolation;

1.3.2 进行测试

我们首先查询出一条数据 select num from user where id=1;

当前mysql数据库事务的隔离级别是 可重复读,他遇到的问题是幻读,但是不会出现脏读,不可重复读;

1.3.2.1演示是否有脏读问题:

一个事务读到了另一个事务还没有提交的东西;

演示: 我们开启两个事务,就是两个客户端A和B,相当于两个事务

A客户端开启事务,并且修改数字,但是不进行提交

我们用A客户端查询,发现在当前客户端已改

然后使用B客户端进行查询

发现没有改,我们在A客户端进行提交,

在B客户端进行查询

说明在当前的mysql数据库,没有脏读问题,因为一个事务改变了数据,没有提交的情况下,其他事务是不可能读取到还没有提交的数据

1.3.2.2 演示是否有不能重复读问题:
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-05-27,如有侵权请联系 cloudcommunity@tencent.com 删除
目录
  • 目录
  • 1 事务
    • 1.1 事务特性
    • 1.2 隔离级别
    • 1.3 实战解释各个级别遇到的问题
      • 1.3.1 查询当前数据库的隔离级别
      • 1.3.2 进行测试
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档