MySQL 事务

目录

一、事务概述

二、事务的特性--ACID

三、MySQL使用事务

1、MySQL开启事务、回滚事务、提交事务命令。

2、自动提交策略

四、事务隔离级别

1、脏读

2、不可重复读

3、幻读(虚读)

4、隔离事务的级别


一、事务概述

Transaction,一个最小的不可再分的工作单元,通常一个事物对于一个完整的业务。一个完整的业务需要批量处理DML语句共同联合完成,事务之和DML语句有关。数据事物是访问并不可能操作各种数据项的一个数据库操作序列,这些操作要么完全执行,要么完全都不执行,是一个不可分隔的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

事务:一组逻辑操作单元,使数据从一种状态变换到另一种状态。

事务处理:保证所有事物作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务执行多个操作时,要么所有的事物都被提交(commit),那么这些修改就永久地保存下来;要么数据库管理系统将放弃所作的所有修改,整个事物回滚(rollback)到最初状态。

为确保数据库中数据的一致性,数据的操纵应当时离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事物应全部视为错误,所有从起始点后的操作应回退到开始状态。

二、事务的特性--ACID

1、原子性(Atomicity):原子性是指事物是一个不可分隔的工作单位,事物中的操作要么都发生,要么都不发生。

2、一致性(Consistency):事物必须使数据库从一个一致性状态变换到另外一个一致性状态。

3、隔离性(Lsolation):事物的隔离性是多个用户并发访问数据库时,数据库为每个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。

4、持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

三、MySQL使用事务

1、MySQL开启事务、回滚事务、提交事务命令。

begin 说明:在5.5 以上的版本,不需要手工begin,只要你执行的是一个DML,会自动在前面加一个begin命令。

commit:提交事务 完成一个事务,一旦事务提交成功 ,就说明具备ACID特性了。

rollback :回滚事务 将内存中,已执行过的操作,回滚回去。

2、自动提交策略

MySQL默认已经开启自动提交,我们可以通过对应的设置来开启或者关闭自动提交。

可以用select或者show语句来查看当前状态,1代表开启,0代表关闭

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            1 |
+--------------+
1 row in set (0.00 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

关闭自动提交

#第一种方式
mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

#第二种方式
mysql> set global autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
|            0 |
+--------------+
1 row in set (0.00 sec)

注:自动提交是否打开,一般在有事务需求的MySQL中,将其关闭,不管有没有事务需求,我们一般也都建议设置为0,可以很大程度上提高数据库性能。

四、事务隔离级别

当多线程开启各自事务操作数据库时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。

如果不考虑隔离性,就会引发一些问题:1、幻读;2、不可重复读取;3、脏读;

1、脏读

指一个事务读取了另一个事务未提交的数据。

2、不可重复读

指在数据库访问种,一个事务范围内两个相同的查询却返回了不同的数据,也就是在一个事务内,多次读取同一个数据,在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么在第一个事务的两次数据之间。由于一个事务的修改,那么第一个事务两次读取到的数据可能不一样,这就发生了一个事务内两次读取到的数据不一样,因此称为不可重复度。

3、幻读(虚读)

查询到的结果条数不同(增加了或者删除了记录)。

幻读产生的影响会造成一个事务中先产生的锁,无法锁住后加入的满足条件的行。

产生幻读的原因:行锁只能锁住行,即使所有的记录都上锁,也阻止不了新插入的记录。

解决幻读的方法:

1、将两行记录的空隙加上锁,阻止新记录的插入,这个称为间隙锁。

2、间隙锁与间隙锁之间没有冲突关系,若间隙锁存在冲突关系,是往间隙中插入一个记录这个操作。

4、隔离事务的级别

MySQL 事务_第1张图片

Serializable:可避免脏读、不可重复读、虚读情况的发生。----(串行化)

Repeatable read:可避免脏读、不可重复读情况的发生。----(可重复读)

Read committed:可避免脏读情况发生。----(读已提交)

Read uncommitted:最低级别,以上情况均无法保证。----(读未提交) 

查看当前事务级别命令:

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)

修改事务级别命令:

mysql> set transaction isolation level 隔离级别;

你可能感兴趣的:(MySQL,mysql,oracle,数据库)