目录
1.事务
1.1概念
1.2特征
1.3隔离级别
1.3.1内容
1.3.2查看
1.3.3修改
1.4操作
1.4.1开始事务
1.4.2执行语句
1.4.3提交事务
1.4.4回滚事务
1.5三种错误
1.5.1脏读
1.5.2不可重复读
1.5.3幻读
事务简而言之是SQL语句的组合,为实现某种复合型功能。其中将有序的SQL语句作为一个逻辑单元执行,如果其中任何一个语句失败,则整个事务将被回滚到起始状态,以确保数据的一致性。
如果仅是简单的SQL语句有序组合,那么事务概念还不足够清晰。因此事务的概念还需满足四种特征,即原子性(Atomicity),一致性(Consistency),隔离性(Isolation,又称独立性),以及持久性(Durability),简称ACID。
MySQL支持多种事务隔离级别,用于控制多个事务之间的可见性和影响范围。事务隔离级别决定了一个事务中的修改对其他事务的可见性,以及其他事务对该事务的修改的可见性。
共计四种事务隔离级别,分别是:
具体的,我们可以使用如下SQL语句来查看当前的隔离级别。
select @@tx_isolation;
执行上述语句,我们便可以在终端上看到:
说明当前的隔离等级是可重复度级别。
我们也可以使用如下语句来对当前的隔离级别作以修改。
set global transaction isolation level READ UNCOMMITTED;
上述语句的意思是将当前的隔离级别修改为读未提交级别,具体的执行结果如下:
给出全部的隔离等级修改语句:
set global transaction isolation level READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE;
事务开始的操作语句有以下两种:
start transaction;
或是:
begin;
开始事务之后,我们便可以添加SQL语句进入,来当作本次事务的内容来进行完成。可以是表的创建,删除和更新等操作。
提交事务的语句如下:
commit;
当执行结束数据库的操作语句,且保证其执行成功之后,我们便可以使用commit语句来将事务的操作永久的保存到数据库当中。
回滚事务的语句如下:
rollback;
如果执行数据库的操作语句过程中,出现错误或结果与预期不符时,我们可以使用rollback语句来将事务的操作撤销,将数据库恢复到事务开始前的状态。
MySQL当中还为我们提供了添加回滚节点的语句,即创建保存点,允许在事务中部分回滚。这在处理复杂的事务操作时非常有用。具体的创建语句如下:
savepoint savepoint_name;
后续savepoint_name为自定义的节点名称,便于后续回滚时,判断具体回滚到那一节点。
例如此时需要回滚到savepoint_name节点,我们需要进行执行的MySQL语句便是:
rollback to savepoint_name;
最后,需要注意的内容是,一旦事务执行过程中出现异常,为维护事务的原子性,系统会自动的回滚,来保证数据库中数据的完整性。
并且,上述回滚也不是万能的,一旦事务被提交,则意味着对数据库内容的修改已经完成,是不可逆的。所以,事务提交意味着回滚也无法再执行。
在上述的隔离级别当中,我们提到了脏读、不可重复读和幻读三种问题,在此我们对其内容进行介绍。
脏读(Dirty Read):是指一个事务在读取另一个事务未提交的数据时,从未提交的数据中读取到了不一致的内容。此时,当被读取数据的事务发生回滚时,读取数据事务获得的内容可能是错误的或不存在的。
脏读主要发生在隔离等级为“读未提交”当中。
不可重复读(Non-repeatable Read):是指一个事务内多次读取同一数据,在此期间另一个事务修改了该数据,导致两次读取的数据不一致。此时,会破坏数据的一致性,使得同一个事务当中多次读取到的数据结果不一致。
不可重复读主要发生在隔离级别为“读提交”和“可重复读”当中。
幻读(Phantom Read):是指一个事务在读取一组数据时,另一个事务插入了符合该条件的新数据,导致第二次读取时结果不一致。此时,容易导致事务在读取期间新增或删除数据,使得查询结果不一致。
幻读主要发生在隔离级别为“可重复读”和“串行化”当中。