1、 事务(Trasaction)
事务(transaction): 主要用来处理操作量大,复杂度高的数据,事务是原子操作,不可再分,要么同时成功,要么同时失败,即一个事务是一个完整的业务逻辑单元。在MySQL数据库中只有使用InnoDB引擎的数据库才能使用事务。事务主要用来管理DML(数据操作语言),即insert语言、update语言以及delete语言,其他不可以。
一般来说事务必须满足四个特征:即ACID
- 原子性(Atomicity):又叫不可分割性,它是指一个事务中的所有操作,要么全部完成,要么全部不完成,不会在中间某个阶段结束。在执行的过程中一旦事务发生错误就会被**回滚(rollback)**到最初执行时的位置(状态),就像这个事务没有执行过一样。
- 一致性(Consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。
- 隔离性(Isolation):又叫独立性,它是指每个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发执行的其他事务是隔离的,各个事务之间不能互相干扰。事务的隔离级别一般有四种,即读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable),分别对应1-4个级别,其中mysql数据库默认的隔离级别是第三级别(可重复读)。
- 持久性(Durability):也称为永久性,它是指一个事务一旦成功提交,对数据库中的数据改变使永久的,不会轻易丢失,就算系统故障也不会丢失。
2 、事务类型
在数据库中一般有三种事务类型:自动事务、隐式事务、显示事务,每种事务类型都有与之对应的提交方式。
1 、自动事务
自动事务是指能够自动开启事务并且能够自动结束事务。如果自动提交模式被启用,则单条DML语句将缺省地开始一个新的事务。
如果该语句执行成功,事务将自动提交,并把执行结果永久的保存在数据库中。如果语句执行失败,事务将自动回滚,并取消该语句的结果。
同样,在自动提交模式下,仍可使用start transaction语句来显式地启动事务。这时,一个事务仍可包含多条语句,直到这些语句被统一提交或回滚。
在自动事务中通常使用关键字 AUTOCOMMIT来开启关闭事务的自动提交:
禁止自动提交:set autocommit = 0
开启自动提交:set autocommit = 1
2、 显式事务
显式事务又称自定义事务,是指用显式的方式定义其开始和结束的事务,当使用start transaction和 commit语句时则表示发生显式事务。
3、 隐式事务
隐式事务是指每一条数据操作语句都自动地成为一个事务,事务的开始是隐式的,事务的结束有明确的标记。即当用户进行数据操作时,系统自动开启一个事务,事务的结束则需手动调用 commit或 rollback语句来结束当前事务,在当前事务结束后又自动开启一个新事务。
3 、事务的控制语句(TCL)
-
事务(Transaction):一批操作,主要是DML。
-
开启事务:Start Transaction /begin
-
回滚事务:**rollback,**回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
-
提交事务: commit,对数据库进行的所有修改成为永久性的
-
自动提交模式:set sutocommit
- 禁止自动提交:set autocommit = 0
- 开启自动提交:set autocommit = 1
-
保存点:savepoint,允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT
-
删除保存点:release savepoin,删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常
-
设置隔离级别:set transaction
隔离性:
4 、事务隔离级别
4.1 并发带来的问题
事务在并发执行读取数据时可能会出现几个问题:
- **脏读(Dirty Read):**一个事务(A)已经更新了某条数据(假设为M),但没有来的及提交写回数据库时,另一个事务(B)就开始读取这条数据(M),此时事务B读取到的数据不是最新的数据,这就出现了脏读取。
- **不可重复读(Non-repeatable Read):**在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。
- 幻读(Phantom Read): 幻像读是指在同一个事务中以前没有的行,由于其他事务的提交而出现的新行。
4.2 四个隔离级别
在MySQL中 InnoDB 存储引擎实现了四个隔离级别(其他存储引擎不支持事务),用以控制事务所做的修改,并将修改通告至其它并发的事务,现在一般有4个,一般用第一级别:
-
第一级别:读未提交(read uncommitted),即对方事务没有提交,但是已经读到数据,会造成读脏数据。
-
第二级别:读已提交(read commintted),即对方事务已经提交,我方可以读到数据,可以解决读脏数据,但是会造成不可重复读数据。
-
第三级别:可重复读(repeatable read),可以解决不能重复读数据,但是可能会造成幻读
-
第四级别:序列化读/串行化读(serializable),可以解决所有问题,但是效率低
mysql默认的隔离级别为 可重复读。oracle默认的隔离级别是读已提交
隔离级别 | 脏读(Dirty Read) | 不可重复读(Non-repeatable Read) | 幻读(Phantom Read) |
---|---|---|---|
读未提交(read uncommitted) | Yes | Yes | Yes |
读已提交(read commintted) | NO | Yes | Yes |
可重复读(repeatable read) | NO | NO | Yes |
序列化读/串行化读(serializable) | NO | NO | NO |
设置隔离级别:
set global trasaction isolation level read uncommitted/read committed/repeatable read/serializable;
查看隔离级别
mysql> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
1 row in set
------------------------------------------------------------------------------------END-----------------------------------------------------------------------------------------
MySQL多表查询:-------------------------------------------------------《加载完成》------------------------------------------------------------------------------