理解数据库事务

本文详细解释了事务的概念,包括其基本功能(原子性、一致性、隔离性和持久性)、操作(开启、提交和回滚),以及在MySQL中的应用,特别关注了自动提交与手动提交的区别,以及并发情况下可能出现的问题,如脏读、不可重复读和幻读。
摘要由CSDN通过智能技术生成

一直不是很理解事务,做个笔记进行整理。

我的理解是:事务就是通过使用SQL语句来操作数据表现一件事(就是事务是一个或者多个SQL语句,当是多个SQL组成的的时候会有开启事务和提交事务,只有一个SQL语句是默认开启和提交的)。

最简单的事务就是一般的SQL语句(直接数据赋值等)。比较复杂一点点的就是一件事可以通过表的数据改变来体现。

这里个表

最简单的:我直接给张三的钱进行更新,没有道理的更新(不涉及其他数据),这就算一个事务,最简单的事务,这个事务由一个SQL语句组成。

复杂一点点的:它就不是一句话了,可以理解为一件事情,李四借张三200块钱。这就至少有两个操作了,李四钱减少200,张三钱增加200,这个时候把这两个操作作为一个事务(事务是最小的单位)这个事务,就代表借钱这件事。这件事产生的数据变化,通过数据库表示,由多个SQL语句组成,就是一个复杂一点点的事务。

上面两种说的是显示事务和隐式事务。但我理解就这样了。

存储引擎

通过show engines;查看搜索引擎,默认使用InnoDB,支持Transactions。

事务的基本功能

事务:一条或多条SQL语句组成一个执行单元,其特点是这个单元要么同时成功要么同时失败。

单元种的每条SQL语句都相互依赖,形成一个整体。

如果某条SQL语句执行失败或者出现错误,那么整个单元就会撤回到事务最初的状态。

如果单元种所有的SQL语句都执行成功,则事务就顺利执行。

事务的特点(ACID)

原子性:(Atomicity)

一致性:(Consistency)事务必须使数据库从一个一致状态变换到另外一个一致状态。可以理解为,只能看到事务执行前和执行后的两种数据状态,而不能看到执行事务中,部分SQL语句执行处理了数据,而部分SQL语句没有处理的状态。李二给王五转账50元,其事务就是让李二账户上减去50元,王五账户上加上50元;一致性是指其他事务看到的情况是要么李二还没有给王五转账的状态,要么王五已经成功接收到李二的50元转账。而对于李二少了50元,王五还没加上50元这个中间状态是不可见的。

隔离性:(Isolation)

持久性:(Durability)

事务的操作

开启事务

START  TRANSACTION

回滚事务

ROLLBACK

当事务中的某一操作,操作失败,导致事务回滚,保证事务的一致性

提交事务

COMMIT

事务的提交方式

自动提交和手动提交。当参数@@AUTOCOMMIT设置为1时,为自动提交方式。一个简单的SQL语句,就是一个最简单的事务。

--查看提交方式
SELECT @@autocommit;

--修改提交方式
SET autocommit=1;
--自动提交
SET autocommit=0;
--手动提交

举例

一、查看表。数据库test中的数据表;

二、查看表中数据。查看表sys_role中的内容;

三、隐式事务。(单个DML语句,具有自动提交事务的功能。)修改表中的院长数据为校长;

四、此时查看自动提交状态;select @@autocommit;并进行修改为非自动提交set autocommit=0;

五、此时真正进行显性事务的测试。内容:将校长的职能改为“负责全校的工作”,将讲师的职能改为“准备讲义并且授课”;

①开始事务

②第一个SQL语句;

③查看此时表中内容;

产生疑惑,不是说事务是最小的单位吗?在事务没有执行完时不存在中甲的状态。于是决定打开Navicat进行查看(认为观察应该也有权限之分的)。

④通过Navicat进行查看内容;

表中的内容没有发生变化,及确定了事务的一致性,数据是从一种状态到另一种状态的。

⑤继续修改,并且通过Navicat进行查看表中数据;

Navicat观察数据没有发生变化。

⑥事务提交同时进行观察数据;

数据成功的更改;

六、其他问题测试;1、关闭自动提交的情况下执行单个SQL语句什么情况??

此时的手动提交;

MySQL中观察zhangsan修改为了lisi,但是Navicat观察没有变化;

commit;之后成功修改;

2、不开启自动提交执行,多个SQL语句是什么个情况??

commit;

所以可以理解为自动开启事务;

3、反过来通过Navicat进行事务操作,再用Mysql查看就更好理解了;

提交;

发现MySQL中查看居然变化,就奇怪了。所以反手试一下提交;

立马出现了变化;应该是自动提交的问题Navicat中的事务处理为一个SQL语句,通过自动提交来进行事务的提交,这就尝试一下。

设置autocommit并且查看当前表内容;

Navicat中修改并且提交事务;

Mysql中查看,这次不需要再手动提交了。

总结:通过这次实例的操作,在我软件版本和电脑环境上发现的细节。

自动提交的情况下,使用Navicat进行提交事务时,不需要Mysql上进行手动提交。而如果是手动提交的情况上就需要手动提交,及Navicat提交的事务,相当于一个简单SQL语句,需要手动提交。(那如果我这个时候进行其他操作,或者说回滚呢了??是不是就会有冲突??)

这里使用rollback;进行数据的回滚,但是这样的情况绝对是哪里有问题,冲突了,咋个再研究。。。。。我继续看事务并发的问题。

补充:尝试了一下在MySQL中创建事务,但是不提交,然后再在Navicat中进行提交事务,直接卡死了,这应该就是保护机制吧!!

事务并发

脏读:

不可重复读:

幻读:

四种事务隔离级别,用来隔离并发运行各个事务,使得它们相互不受影响,这就是数据库事务的隔离性。

睡觉

  • 21
    点赞
  • 36
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值