前言
一、事务是什么?
事务就是一组相关DML语句构成的,它是一个整体。
(1)事务的四个属性
1.原子性:
一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中 间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个 事务从来没有执行过一样。
2.一致性:
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完 全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工 作。
3.隔离性:
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务 并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交( Read uncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化 ( Serializable )
4.持久性:
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
二,事务的基本操作
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务, MyISAM 不支持。
查看数据引擎:
show engines /G
事务的提交有自动和手动方式,可以通过设置
查看方式:
(1)禁止自动提交
(2)自动提交
(3)事务的操作
1.不设断点,直接rollback,表示放弃事务开始之后的一切操作。
(1)事务的开始:start transaction; 或者 begin;
开始之后的执行的一切都是这一个事务。
(2)事务的回滚:我们可以通过设置断点,通过回滚恢复到断点前的数据状态。
设置断点:savepoint save1;
执行:rollback to 断点 / rollback
注意:不设置断点,直接rollback表示直接放弃事务的执行的所有操作
事务的回滚有效性必须是在事务运行期间,提交之后回滚是无效的。
(3)事务的提交:commit (一个事务的结束)
数据就持久化了。
事务是一组DML语句,平时我们操作是单条语句,那么它和事务有什么关系?默认单条语句是一个事务。
1.如果我们设置提交方式是默认自动提交的,一条语句就是一个完整的事务,执行完这一条数据就自动提交持久化了,即使回滚不起作用。
2.如果我们设置提交方式是禁止自动提交的,它可以回滚
二、事务的隔离级别
1.什么是隔离级别
事务的原子性关注的是一个事务要么完成状态要么是初始的状态。在高并发中,事务在执行过程中
可能会 出现互相影响的情况。比如:多个事务同时访问同一张表,甚至同一行数据。数据库中,允许事务受不同程度的干扰,就有了一种重要特征:隔离级别。我们可以设置隔离级别
(1)查看全局隔离级别
(2)查看当前会话隔离级别
(3)设置当前会话的隔离级别
语法:-- 设置当前会话 or 全局隔离级别语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
那么全局和会话的有什么区别的呢,在没有设置会话的隔离级别的。默认是继承全局的,会话的修改不会影响全局的,全局的修改会影响会话的(没有修改会话的话)。
场景:
(1)读未提交【Read Uncommitted】
我们开始一个事务,我们发现删除事务还没提交,另一个会话就看到了删除后的数据。这个存在在一个问题,如果删除的这个事务回滚了,那么另一个会话查询到数据就是不正确。一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读
(2)读提交【Read Uncommitt】
这个和读未提交相反,删除事务只有提交了,另一个会话才查询到删除之后数据而没有提交查询到的还是原来没被删除的数据。同一个会话可以查询到同一张表的不同阶段的数据。当前事务中,并未commit,那么就造成了,同一个事务内,同样的读取,在不同的时间段 (依旧还在事务操作中!),读取到了不同的值,这种现象叫做不可重复读
(3)可重复读
高并发中,一个事务A对数据进行修改,在另一个事务B中运行期间查询数据时查到的数据都是相同的,保证了一致性。事务结束后,查看数据就是已经修改后的。实际它是对数据进行加锁,但是对insert插入数据时,由于插入的数据在原来的表中不存在,无法加锁,查询事务B中会查询到不同的数据,而可重复读是数据一致,这个结果有点矛盾,这就是幻读。
(4)串行化
对数据库表的操作进行加锁,但是查询是不加锁的。事务A中有更新或者其他操作,会阻 塞。直到事务B事务提交。可以理解为事务按序先后执行。
(5)一致性
事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务 成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中 断,而改未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确(不一 致)的状态。因此一致性是通过原子性来保证的。