mysql事务

一、什么是事务

事务是逻辑上的一组操作,要么都执行,要么都不执行。

谈论事务的时候,如果没有特指分布式事务,往往指的就是数据库事务。

数据库事务可以保证多个对数据库的操作(也就是 SQL 语句)构成一个逻辑上的整体。构成这个逻辑上的整体的这些数据库操作遵循:要么全部执行成功,要么全部不执行 

# 开启一个事务
START TRANSACTION;
# 多条 SQL 语句
SQL1,SQL2...
## 提交事务
COMMIT;

二、什么是ACID

关系型数据库都有ACID的特性。那什么是ACID呢?

1. 原子性(Atomicity) : 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
2. 一致性(Consistency): 执行事务前后,数据保持一致,例如转账业务中,无论事务是否成功,转账者和收款人的总额应该是不变的;
3. 隔离性(Isolation): 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
4. 持久性(Durabilily): 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。

MySQL InnoDB 引擎使用 redo log(重做日志) 保证事务的持久性(崩溃后恢复也是依靠这个)。

MySQL InnoDB 引擎使用 undo log(回滚日志) 来保证事务的原子性。

MySQL InnoDB 引擎通过 锁机制、MVCC 等手段来保证事务的隔离性( 默认支持的隔离级别是 REPEATABLE-READ )。

保证了事务的持久性、原子性、隔离性之后,一致性才能得到保障。

三、并发事务会带来哪些问题

1. 脏读(dirty read):当一个事务在访问数据并且对数据进行了修改,但是还没有提交(后面可能会回滚),这时另外一个事务也访问了这条未提交的数据,然后使用了这个数据。那么另外那个事务读取到的数据就是脏数据,基于数据的操作可能是错误的。

2. 丢失修改(lost to modify):指两个事务读取了通一条数据,一个数据修改事务后,另外一个事务也修改了这条数据,这样先修改的事务修改的数据就会丢失,称为丢失修改。比如两个事务都对一条count=10的数据+1,最终保存的结果是11,而实际上应该是12。

3. 不可重复读(unrepreatableread):指的是在一个事务内多次读一个数据,在多次读的过程中,由于其他事务修改了该数据,导致多次读同一数据结果不一样,称为不可重复读。

4. 幻读(phantom read):幻读和不可重复读类似,都是多次读,不同的是幻读是一个事务读取多条数据,在多次读的过程中,有其他事务增加或者删除了几条数据,好像是幻觉一样,称为幻读。

不可重复读和幻读的区别:都是多次读,不可重复读强调读到的内容变了,有事务修改了数据;幻读强调读读到的数量变了,有事务新增或者删除了数据。

四、事务隔离级别

1. READ-UNCOMMITTED(读取未提交):最低的隔离级别,可以读取未提交的数据,可能导致脏读、幻读、不可重复读

2. READ-CMMMITTED(读取已提交):可以读取提交的数据,可以阻止脏读,不能阻止不可重复读和幻读

3. REPEATABLE-READ(可重复读):对同一个数据多次读取的结果是一样的,除非是事务本身修改的,可以防止脏读和不可重复读,不能防止幻读。

4. SERIALIZABLE(可串行化):最高的隔离级别,完全遵循ACID的隔离级别,所有事务依次逐个执行,事务间互不干扰,可以防止脏读,不可重复读和幻读。

MySQL InnoDB 存储引擎的默认支持的隔离级别是 REPEATABLE-READ(可重读)。我们可以通过SELECT @@tx_isolation;命令来查看,MySQL 8.0 该命令改为SELECT @@transaction_isolation;

InnoDB 存储引擎在 分布式事务 的情况下一般会用到 SERIALIZABLE(可串行化) 隔离级别。

InnoDB 存储引擎提供了对 XA 事务的支持,并通过 XA 事务来支持分布式事务的实现。分布式事务指的是允许多个独立的事务资源(transactional resources)参与到一个全局的事务中。事务资源通常是关系型数据库系统,但也可以是其他类型的资源。全局事务要求在其中的所有参与的事务要么都提交,要么都回滚,这对于事务原有的 ACID 要求又有了提高。另外,在使用分布式事务时,InnoDB 存储引擎的事务隔离级别必须设置为 SERIALIZABLE。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值