MySQL 事务处理

Q:什么是事务?
A:指的是一组 SQL 语句或者一个执行单位,要么全部执行成功,提交到数据库,要么中间出错全部回滚,不影响数据库。

Q:事务的用途有哪些?
A:①、确保尚未全部完成的操作不会影响到数据库,以致不会让数据库处于部分更新(不一致)状态;②、确保在操作某个数据行(MySQL 会对涉及到的资源进行锁定)时,不会被其他客户端修改

Q:事务的特性有哪些?
A:具有 ACID 四种特性。
①、Atomic(原子性):构成事务的所有语句是一个独立的逻辑单元,也就是你不能只执行所有语句中的一部分语句
②、Consistent(一致性):数据库在事务的执行前后必须是一致的。也就是说一个表中的 ID ,必须在另一个表中找到,否则回滚。
③、Isolated(独立性):事务之间不应该相互影响,也就是在并发执行时,事务能够挨个执行。
④、Durable(持久性):当事务执行成功完成时,会永久性地记录到数据库中。

注意:要想使用事务,就必须选用一种支持事务处理的存储引擎。如 InnoDB。

利用事务保证语句安全执行

MySQL 默认是自动提交到数据库(永久性保存)

-- 查看执行事务的方法:1:开启自动提交 0:禁用自动提交
SELECT @@global.autocommit;
SELECT @@session.autocommit;
SELECT @@autocommit;

两种执行事务的方法:
1、start transaction(或 begin)语句

-- ①、挂起自动提交模式,开启一个新的事务。
START TRANSACTION;
-- ②、执行构成本次事务的各条 SQL 语句
INSERT INTO t SET name = 'zhangsan';
INSERT INTO t SET name = 'lisi';
-- ③、用 COMMIT 语句永久性保存这些更改 或者 用 ROLLBACK 语句撤销所有更改。
COMMIT;
SELECT * FROM t;

注意:它是开启一个新的事务,在事务被提交或回滚之后,该模式将恢复到开始本次事务的 START TRANSACTION 语句被执行之前的状态(如果自动提交模式原来是激活的,结束事务将让你回到自动提交模式;如果它原来是禁用的,结束当前事务将开始下一个事务)

2、SET 语句直接操作自动提交模式的状态

-- ①、禁用自动提交
SET AUTOCOMMIT = 0;
-- ②、执行构成本次事务的各条 SQL 语句
INSERT INTO t SET name = 'zhangsan';
INSERT INTO t SET name = 'lisi';
-- ③、用 COMMIT 语句永久性保存这些更改 或者 用 ROLLBACK 语句撤销所有更改。
COMMIT;
-- ④、开启自动提交
SET AUTOCOMMIT = 1;

注意:是在当前 session 禁用自动提交事物。

使用事务保存点

MySQL 可以对事物进行部分回滚(即回滚到保存点)。

CREATE TABLE t(i INT) ENGINE = InnoDB;
START TRANSACTION ;
INSERT INTO t VALUES (1);
SAVEPOINT my_savepoint; -- 保存点
INSERT INTO t VALUES (2);
ROLLBACK TO SAVEPOINT my_savepoint; -- 回滚到保存点
INSERT INTO t VALUES (3);
COMMIT ;
SELECT * FROM t; -- 1 、 3
事务隔离

在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别
在多个事务并发操作的过程中,如果控制不好隔离级别,就有可能产生脏读、不可重复读或者幻读等读现象。

  • 脏读:一个事务读取到了另一个事务未提交的数据操作结果。危险之处:很可能所有的操作都被回滚
  • 不可重复读:同一个事务使用同一条 SELECT 语句在每次读取时得到的结果都不一样
  • 幻影行一个事务突然看到一个以前没有见过的数据行。某个事务在 SELECT 之后,另一个事务插入一条新的数据行,如果第一个事务再执行同样的一条 SELECT 语句,则可能会看到这个新增行,而它其实是一个幻影。

为了解决以上这些问题,InnoDB 存储引擎提供了 4 种事务隔离级别
* READ UNCOMMITTED:允许某个事务看到其他事务尚未提交的行修改。
* READ COMMITTED:只允许某个事务看到其他事务已经提交的行修改。
* REPEATABLE READ:如果某个事务两次执行同一条 SELECT 语句,其结果是可重复的。也就是说,即使有其他事务在同时插入或修改行,这个事务所看到的结果也是一样的。
* SERIALIZABLE:对于某个事务正在查看的行,只有等到该事务完成才能被其他事务所修改

InnoDB 存储引擎默认的隔离级别REPEATABLE READ
修改它的两种方式:①、在服务器启动时使用 –transaction-isolation 选项;②、在服务器运行时使用 SET TRANSACTION 语句

-- 查看隔离级别
select @@global.tx_isolation;
select @@session.tx_isolation;
SELECT @@tx_isolation;

-- 改变全局隔离级别,作用于后续的所有客户端连接
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
-- 改变当前会话里的所有事务的隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
-- 改变下一个事务的隔离级别
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;

最后:四种事务隔离级别从隔离程度上越来越高,但同时在并发性上也就越来越低。我们应该在开发过程中根据业务需要选择最合适的隔离级别。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL事务处理是一种用于确保数据库操作的一致性和完整性的机制。事务是一组数据库操作,要么全部成功执行,要么全部回滚到初始状态。 在MySQL中,事务处理的关键是使用ACID属性来保证数据的一致性和可靠性: 1. 原子性(Atomicity):事务中的所有操作要么全部成功执行,要么全部失败回滚。MySQL使用日志来记录事务的操作,以便在发生故障时进行回滚。 2. 一致性(Consistency):事务开始之前和结束之后,数据库的完整性约束没有被破坏。如果事务执行过程中发生错误,所有已经执行的操作将被回滚,数据库将回到事务开始之前的状态。 3. 隔离性(Isolation):并发执行的事务之间相互隔离,每个事务都感觉不到其他事务的存在。MySQL通过锁机制来实现隔离性,保证事务之间不会相互干扰。 4. 持久性(Durability):一旦事务提交成功,其所做的修改将永久保存在数据库中,即使发生系统故障也不会丢失。 在MySQL中,可以使用以下语句来控制事务的开始、提交和回滚: 1. BEGIN或START TRANSACTION:开始一个新的事务。 2. COMMIT:提交事务,使之生效。 3. ROLLBACK:回滚事务,撤销之前的操作。 在实际应用中,事务处理可以用于处理复杂的业务逻辑,确保数据的完整性和一致性。同时,合理地使用事务可以提高数据库的性能和并发能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值