事务的基本介绍

本文介绍了数据库事务的基础知识,包括事务的概念——一组操作要么全部成功,要么全部失败,以及开启、回滚和提交事务的操作。事务的四大特性——原子性、持久性、隔离性和一致性,确保了数据的正确性。此外,文章还讨论了事务的四种隔离级别及其在并发操作中可能出现的问题,如脏读、不可重复读和幻读,并举例说明了不同隔离级别如何解决这些问题。
摘要由CSDN通过智能技术生成

1、概念

  • 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。在这里插入图片描述
    例如:张三给李四转装500元 (上图3个操作被事务所管理),如要想被事务管理,首先要开始事务,上图步骤中要么同时成功,如果在某步骤中出现了异常,表示失败,那么就会做出回滚的操作,否则成功就提交事务。

2、事务操作

  • 1、开启事务:start transaction;在mysql中
  • 2、回滚:rollback ;
  • 3、提交:commit;
  • 4、mysql数据库中事务默认自动提交,而oracle数据库为手动提交;事务提交的两种方式:
    ①自动提交:mysql中就是自动提交的,一条DML(增删改)语句会 自动提交一次事务
    ②手动提交:需要先开启事务,再提交;
    查看事务的默认提交方式:select @@autocommit; 1 表示自动提交 0 表示手动提交;
  • 修改默认提交方式:set @@autocommit =0;
    代码实例:
CREATE TABLE account (
				id INT PRIMARY KEY AUTO_INCREMENT,
				NAME VARCHAR(10),
				balance DOUBLE
			);
			-- 添加数据
			INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
			SELECT * FROM account;
			UPDATE account SET balance = 1000;
			-- 张三给李四转账 500-- 0. 开启事务
			START TRANSACTION;
			-- 1. 张三账户 -500
			UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
			-- 2. 李四账户 +500
			-- 出错了...
			UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
			-- 发现执行没有问题,提交事务
			COMMIT;
			-- 发现出问题了,回滚事务
			ROLLBACK;

3、事务四大特征

  • 1、原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;
  • 2、持久性:当事务提交或回滚后,数据库会持久化的保存数据。
  • 3、隔离性:多个事务之间相互独立,互不干扰;
  • 4、一致性:事务操作前后,数据总量不变

4、事务的隔离级别(了解)

  • 概念:多个事务之间隔离的,相互独立的。但是如果多个事务操作同一批数据(并发),则会引发一些问题,设置不同的隔离级别就能解决这些问题。
  • 存在的问题:
    1.脏读:主要针对未提交的数据,一个事务,读取到另一个事务没有提交的事务。
    例如:A 给 B 转了100万,但是 A 还没有提交,此时 B 查询自己账户,多了100万。然后 A 发现转错人了,回滚了事物。然后 B 100万就没了。在这个过程中 B 查到了没有提交的数据(多出的100万),这就是脏读。
    2.不可重复读(虚读):在同一个事务中,两次读取到的数据不一样;
    例如:A 查询银行余额为100万,B 这个时候取走了50万,此时余额变成了50万,A 再一次查询余额,变成了50万。对 A 而言两次结果不一致就是不可重复读。
    3. 幻读(在一个事务里面的操作中发现了未被操作的数据,针对增删操作)即在事务 A 多次读取数据集的过程中,事务 B 对数据进行了新增操作或者删除操作,导致事务 A 多次读取的数据集不一致。
    例子:A 修改当前公司所有职员信息的时候,B 向其中插入了一个新的职员,这个时候 A 提交的时候发现了一个自己没有修改过的职员的信息,对 A 而言就像是产生了幻觉。

四种隔离级别

为了应对上面并发情况下出现的问题,事务的隔离级别就产生了。当事务的隔离级别越高的时候,上面的问题就会越少,但是性能消耗也会越大。所以在实际生产过程中,要根据需求去确定隔离级别。

四种隔离级别#

  • READ_UNCOMMITTED
      读未提交,即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种。
  • READ_COMMITED
      已提交,即能够读到那些已经提交的数据,能够防止脏读,但是无法解决不可重复读和幻读的问题。
  • REPEATABLE_READ
      重复读取,即在数据读出来之后加锁,类似"select * from XXX for update",明确数据读取出来就是为了更新用的,所以要加一把锁,防止别人修改它。REPEATABLE_READ的意思也类似,读取了一条数据,这个事务不结束,别的事务就不可以改这条记录,这样就解决了脏读、不可重复读的问题,但是幻读的问题还是无法解决。
  • SERLALIZABLE
      串行化,最高的事务隔离级别,不管多少事务,挨个运行完一个事务的所有子事务之后才可以执行另外一个事务里面的所有子事务,这样就解决了脏读、不可重复读和幻读的问题了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

2年工作经验的小胡歌

你的打赏是对博主最大的支持和鼓

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值