数据库学习-MySQL基础篇(三)

1. 初识事务

(1) 什么是事务?

  • 事务是一组SQL语句,这组SQL语句是一个执行单位,要不全部执行成功,要不全部执行不成功。
  • 事务中的SQL语句要不全部对数据库产生影响,要么全部都不产生影响,数据库总是保持一致性状态,即使是数据库发生故障或者事务并发情况下也是如此。
    典型的事务语句
START TRANSACTION
SQL1
SQL2
COMMIT/ROLLBACK

(2) 为什么要使用事务?

  • 确保尚未全部完成的操作不会影响数据库,而且保证数据库不会处于部分不一致的状态
    如财务转账,需要执行以下两条指令:
UPDATE account SET balance=balance-100 WHERE name='Bill';
UPDATE account SET balance=balance+100 WHERE name='Dell';

如果第一条指令执行完毕发生了故障,就会导致Bill的账户少了100块钱,但是Dell的账户并没有多100块钱,会出现数据库不一致的情况

  • 确保某个操作所涉及的行不会在你正在使用它们的时候被其它的客户端修改
    MySQL中在执行一条SQL语句时,会自动对该语句所涉及的资源自动锁定,以避免客户端之间相互干扰。但是有些数据库操作需要多条语句才能完成,这种情况下不同客户端之间还是有可能干扰。事务的出现可以防止多客户端并发产生的这类问题。

(3) 事务的四大特性

  • 原子性(Atomic):构成事务的所有语句是一个独立的逻辑单元,不能只执行其中的一部分。
  • 一致性(Consistent):数据库在事务执行的前后必须是一致的。比如银行账户系统有10个账户,在只能进行转账业务的情况下,这10个账户的金额总额是不变的,则为一致的状态,如果金额总额发生了改变则是不一致的状态。
  • 独立性(Isolated):事务之前不应该相互影响。
  • 持久性(Durable):当事务执行完成后,其产生的影响将被永久的记录在数据库中。

2. 事务的使用

注意:

  • 使用事务必须要使用事务支持的引擎,如InnoDB。
  • MySQL中的运行模式是自动提交,即每条语句所做的更改会立即提交到数据库,并永久保存。即每条语句被隐式的当作一个事务。要显式的执行事务,需要禁止或挂起自动提交模式。
-- 禁止自动提交模式
SET autocommit=0;
-- 挂起自动提交模式(一个事务结束后,又回到START TRANSACTION前的模式)
START TRANSACTION;
  • 那些用来创建、删除、更改数据库或其中对象的数据定义语言DDL以及与锁定有关的语句不能成为事务的一部分,即如果使用了这些语句则,服务器在执行这些语句之前先进行一次事务的提交。
    在这里插入图片描述

(1) 简单的使用例子

-- 首先创建一个表格
CREATE TABLE t (name CHAR(20),UNIQUE(name)) ENGINE=InnoDB;
-- 提交例子
START TRANSACTION; -- 挂起自动提交模式
INSERT INTO t VALUES('Bill');
INSERT INTO t VALUES('Dell');
COMMIT; -- 提交事务
SELECT * FROM t;

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

-- 回滚例子
START TRANSACTION; -- 挂起自动提交模式
INSERT INTO t VALUES('Bob');
INSERT INTO t VALUES('Dell');
ROLLBACK; -- 提交事务
SELECT * FROM t;

在这里插入图片描述

(2) 事务保存点

使用事务保存点进行事务的部分回滚,使用SAVEPOINT语句设置一些命名标记,在事务的后续,如果想回滚到某个标记点的位置只需要使用ROLLBACK指定回滚到某个标记点处就可以。

-- 事务保存点例子
-- 创建一个表格
CREATE TABLE t (i INT) ENGINE=InnoDB;
-- 创建事务及保存点
START TRANSACTION;
INSERT INTO t VALUES(1);
SAVEPOINT SavePointTest;
INSERT INTO t VALUES(2);
ROLLBACK TO SAVEPOINT SavePointTest;
INSERT INTO t VALUES(3);
COMMIT;
SELECT * FROM t;

在这里插入图片描述

3. 事务隔离(InnoDB的事务隔离机制)

(1) 事务运行时可能出现的各种问题

  • 脏读:事务A读取了事务B未提交的修改。如果事务B进行回滚,则事务A会读取不一致的数据。
  • 不可重复读:同一事务使用同一条查询语句多次结果不同。如果事务A在两次查询过程中,事务B 修改了事务A要查询的内容,就会发生不可重复读。
  • 幻读:事务A在两次查询过程中,事务B 新增加了内容,导致事务A两次查询结果不一致。

(2) 四种事务隔离级别

  • 读未提交(READ UNCOMMITED):允许事务看到其它事务尚未提交的行修改;
  • 读提交(READ COMMITED):允许事务看到其它事务已提交的行修改;
  • 重复读(REPEATABLE READ):如果事务两次执行同一条查询语句,结果是相同的; ** InnoDB默认 **
  • 序列化(SERIALIZABLE):与重复度和相似,但是隔离更彻底。某个事务正在查看的行,其它事务也不可以修改。
    在这里插入图片描述

(3) 更改隔离级别

-- 启动时使用 --transaction-isolation选项
-- SET TRANSACTION语句
SET GLOBAL TRANSACTION ISOLATION LEVEL levelName; --所有后续客户端连接起作用
SET SESSION TRANSACTION ISOLATION LEVEL levelName; --当前会话里所有后续事务起作用
SET TRANSACTION ISOLATION LEVEL levelName; -- 只对下一事务起作用 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值