- 💂 个人主页:努力学习的少年
- 🤟 版权: 本文由【努力学习的少年】原创、在CSDN首发、需要转载请联系博主
- 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦
在MySQL环境中,事务是由一个单元的一个或多个SQL语句组成,这个单元的每个SQL语句是相互依赖的,而且单元作为一个整体是不可分割的。如果单元中的一个语句不能完成,整个单元就会回滚(撤销),所有影响到数据将返回到事务开始以前的状态,因此,只有事务中所有SQL语句执行成功,则才能说明这个事务被成功执行。使用一个简单的例子来理解事务:
向公司添加一名新员工,这个过程由3个基本步骤组成(如图所示):
如果其中一个步骤失败,则系统必须撤销在此之前的所有变化,删除所有不完整的记录的痕迹,以避免以后的不一致和计算错误。
在 开始事务 和 提交事务 之间所作的所有操作 构成一个事务, 其中任何一个步骤失败都会都会导致整个事务被撤销,系统会返回到以前的状态。
事务提交后,对数据的修改是永久的,即使系统出现故障也不会丢失数据。
事务的提交方式有 自动提交,手动提交 。
在MySQL命令行的默认下,事务都是自动提交的,即执行SQL语句后会马上执行commit操作,我们之前所写的所有单条的DML SQL语句,在MySQL默认是一个事务,默认执行完,就会被MySQL自动提交。
如果要受到的提交可以使用 begin 或者 start transaction,或者将 AUTOCOMMIT=0,表示禁用自动提交。如下:
show variables like 'autocommit';//查看是否启动为自动提交。
SET AUTOCOMMIT=0;//禁用自动提交
手动启动一个事务可以采用如下语句:
start transaction; 或者 begin;
begin 和 commit 之间的所有操作 统称为一个事务。
commit语句是提交语句,它使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,也标记一个事务的结束。
事务回滚有语句有
在MySQL中只有使用了 Innodb存储引擎 的数据表才支持事务,MyISAM不支持。
事务的属性包括 原子性,一致性,隔离性,永久性。
原子性 意味着每个事务都必须看作一个不可分割的单元,假设一个事务由两个或多个操作组成,其中这些操作必须同时成功,则整个事务才成功,否则事务失败,失败将会返回该事务以前的状态。
在添加员工这个例子中,原子性指如果没有创建员工的工资表和部门,就不可能将员工插入到数据库表中。总而言之,原子执行是一个或者全部发送或者什么也没有发生的命题。
事务
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以 防止多个事务并发执行时 由于多个事务的交叉执行 导致数据库中的数据的不一致。比如:事务A正在不断的在修改表中的数据,那么事务B需要不断的查看表的数据,那么事务B每次查看的数据可能不一样。
事务提交后,对数据的修改就是 永久的,即便系统故障也不会丢失。
为了理解一致性,举个通俗易懂的例子:假设我要提现1500块钱提现到银行卡中,那么就需要至少需要分两步操作:
SQL标准定义了4类隔离级别,包括一些具体规则,用来 限定事务内外的哪些改变是可见的,哪些是不可见的,低级别的隔离级别一般支持更高的并发处理,并拥有更低的系统开销。不同的场景使用的隔离级别可能不同。
查看客户端的隔离级别:
select @@tx_isolation; //查看隔离级别
将当前会话的事务A的隔离级别设置为读未提交READ-UNCOMMITTED;
set session tx_isolation='READ-UNCOMMITTED';
如果要设置全局的事务隔离级别(其他会话也会改变),那么需要将session 更改为global,如果隔离级别没有生效,则需要重新登录会话才会生效。
set global tx_isolation='READ-UNCOMMITTED';
实验1:观察读未提交的现象
客户端A开始一个事务,并往person表中插入数据,客户端B启动一个事务并查看person表。
person表:
客户端A:
客户端B:
实验2:查看读提交的现象
将隔离级别设置为读提交,客户端A启动一个事务并给person表插入数据,客户端B查看person表,接下来客户端A提交事务,客户端A再查看person表。
person表:
客户端A插入数据,但没有提交事务,客户端B查看不到插入的数据:
客户端A提交事务,客户端B可以查看到客户端A插入的数据:
客户端B的事务只能查看到客户端A事务提交的数据,这就是读提交。
实验3:查看不可重复读的现象
客户端B开始一个事务并查看person表,然后客户端A开始一个事务并修改person表中的关羽的qq值,然后提交,最后客户端B再查看person表中的数据.
person表:
客户端A:
客户端B:
客户端A事务提交事务前和提交事务后,客户端B的事务查看表的数据是不一致的,这就是不可重复读的现象。
可重复读(REPEATABLE READ)
实验4:查看可重复读的现象
将隔离级别设置为可重复读。
客户端B开始一个事务并查看person表,然后客户端A开始一个事务并修改person表中的关羽的qq值,然后提交,最后客户端B再查看person表中的数据.
person表:
客户端A:
客户端B:
由上面实验可以看到,客户端A的事务修改数据后,不管有没有提交事务,客户端B每次查看数据时只会显示第一次查看到的数据,且在一个事务内只能读取一个记录,期间保持一致,直到客户端B将事务提交,才能读取别的事务修改的记录。
.