MySQL事务

文章详细介绍了数据库事务的概念,包括ACID四大特性——原子性、一致性、隔离性和持久性,并讨论了事务并发执行可能遇到的问题,如脏读、不可重复读和幻读。文章还列举了事务的四种隔离级别及其对这些问题的影响,并提供了MySQL中管理事务的命令,如BEGIN、COMMIT、ROLLBACK等。
摘要由CSDN通过智能技术生成

目录

事务概念

ACID特性

事务的原子性(Atomic):

事务的一致性(Consistency):

事务的隔离性(Isolation):

事务的持久性(Durability):

事务并发存在的问题

事务的四大隔离级别

MySQL的事务处理命令

一、查看MySQL是否自动提交事务

二、核心命令


事务概念

一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完啦,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部成功,要么全部失败。

<1>事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。

<2>事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上

<3>事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态

ACID特性

每一个事务必须满足以下的4个特性

事务的原子性(Atomic):

事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成。

事务的一致性(Consistency):

一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现,就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务。

事务的隔离性(Isolation):

当两个或多个事务并发执行时,为了保证数据的安全性,将一个事务内部的操作与其他事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响。

事务的持久性(Durability):

事务完成以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为在故障出错,也应该能够恢复数据。

注:<1>mysql重要的是日志,不是数据!!!

<2>ACD特征:是由mysql中redo log(重做日志)保证数据库的永久性,undo log(回滚日志)数据恢复到事务开始前的状态

<3>I特征:是由mysql事务的锁机制来实现保证的

事务并发存在的问题

事务处理不经隔离,并发执行事务时通常会发生以下的问题:

脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据。(事务B读取了事务A尚未提交的数据)

不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读取到不同的数据。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样。(事务B读取了事务A已提交的数据)

虚读(Phantom Read)幻读:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)

事务的四大隔离级别

<1>read-uncommitted:未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的。

<2>read-committed:已提交读。说明读取未提交的数据是不允许的。这个级别依然允许不可重复读和虚读产生。

<3>repeatable-read:可重复读。说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。

<4>serializable:串行化。是最高的事务级别。它防止读脏数据,不可重复读和虚读。

隔离级别脏读不可重复读幻读(虚读)
read-uncommitted:未提交读可以可以可以
read-committed:已提交读不可以可以可以
repeatable-read:可重复读不可以不可以可以
serializable:串行化不可以不可以不可以

备注:事务隔离级别越高,为避免冲突所花费的性能也就越多

“可重复读”级别,实际上可以解决部分的虚读问题,可以防止insert和select但不能防止update更新产生的虚读问题,要禁止虚读产生还是需要设置串行化隔离级别。

MySQL的事务处理命令

一、查看MySQL是否自动提交事务

select @@autocommit;

其中:0表示手动提交事务,1表示自动提交事务,设置事务提交方式为手动提交方式:

set autocommit=0;

二、核心命令

BEGIN; //开启一个事务
COMMIT; //提交一个事务
ROLLBACK; //回滚一个事务到初始的位置
SAVEPOINT point1; //设置一个名字为point1的保存点
ROLLBACK TO point1; //事务回滚到保存点point1,而不是回滚到初始状态
SET TX_ISOLATION='REPEATABLE-READ'; //设置事务的隔离级别
SELECT @@TX_ISOLATION; //查询事务的隔离级别
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值