目录
1. 概述
事务(transaction)类似于编程语言中的 方法,包含一组SQL指令。
事务只对 DML ( insert,update,delete 三个关键词的语句 )语句有效;
事务是不可分割的,是最小的工作单元;
事务在数据库中表示一件完整的事情,因此在同一个事物当中,多条DML语句要么同时成功,要么同时失败;
2. 四大特征(A,C,I,D)
原子性(Atomicity):事务是最小的操作单位,其所有操作要么全部成功执行,要么全部失败;
一致性(Consistency):守恒原则,数据执行事务前后的总数是不变的;
隔离性(Isolation):多个用户并发访问同一个数据库时,数据库给每个用户开启的事务,不会被其他事务的操作干扰,即不同的事物之间是不会被影响的;
持久性(Durability):事务一旦被提交,对数据库造成的影响是永久的,即使是数据库系统遇到故障,也不会丢失提交事务的操作;
3. 事务步骤
该指令步骤如下:开启事务,回滚事务,提交事务;
开启事务:start transaction 或者 begain;
回滚事务:rollback;
提交事务:commit;
当然,前面学习 DDL 语句时,每条 DDL 语句是事务默认情况下自动提交的;
如下,是开启事务,提交事务,数据发生持久改变;
如下,开启事务,回滚事务(发生异常会回滚事务),数据没有改变;
没有提交事务之前都不算真正更改数据。
单独执行提交事务:commit,数据才按照事务真正被修改;
4. 隔离性
前面说事务有四个特性,其中隔离性是很重要的一个特性。
4.1 隔离级别
可以把 “隔离” 看作一堵墙,隔开A 事务、B 事务,墙的厚度就是隔离程度;
根据隔离程度的不同,有以下排序(隔离级别越高,效率越低):
隔离级别从低到高排序:读未提交 < 读提交 < 可重复读 < 串行化;
读未提交:隔离级别最低,一般不会用到;
读提交:提交事务后读到的数据;
串行化:多个事务不能并发执行,效率最低,一般不会用到;
oracle 数据库默认的隔离级别是 读提交,MySQL 数据库默认的隔离级别是 可重复读;
4.2 隔离现象
脏读,不可重复读,幻读是不同隔离级别存在的不同现象:
现象的严重性从高到低程度:脏读 > 不可重复读 > 幻读 ;
脏读:读到了另一个事务没有提交的数据;
不可重复读:在一个事务多次重复读取数据,得到的结果是不一样的,这是由于其他事务对数据集进行了修改,导致的结果不一致;
幻读:在事务执行过程中,前后两次查询得到的结果集不一致;
4.3 查看与设置隔离级别
查看当前会话的隔离级别(对当前事务):select @@transaction_isolation ;
查看全局的隔离级别(对所有事务): select @@local.transaction_isolation ;
设置当前事务的隔离级别:set session transaction isolation level 隔离等级;
设置全局事务的隔离等级:set global transaction isolation level 隔离等级;