事务相关
一、基本概念
-
事务:也称工作单元,是由一个或多个SQL语句组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。
-
事务处理语言:Transaction Process Language,简称TPL,主要用来对组成事务的DML语句操作结果进行确认或取消。确认也就是使DML操作生效,使用提交(COMMIT)命令实现;取消也就是使DML操作失败,使用回滚(ROLLBACK)命令实现。
-
通过事务的使用能防止数据库中出现数据不一致现象。如两个银行账户转账,涉及到两条更新操作,这两条更新操作只允许全部成功或失败,否则数据会出现不一致的现象。
二、事务的特征
事务特征可用四个字母的缩写表示的:即ACID
原子性(Atomicity)
事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。
一致性(Consistency)
一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。
隔离性(Isolation)
一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户中取钱,通过事务的隔离性确保账户余额的正确性。
持久性(Durability)
也称永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。
三、事务处理
MySQL的事务处理主要有两种方法
- 用begin,rollback,commit来实现
begin 开始一个事务
rollback 事务回滚 将当前状态回滚到事务开启的状态
commit 事务提交
- 直接使用set来改变MySQL的自动提交模式
MySQL默认是自动提交的,也就是你提交一个sql,就直接执行。可以通过:
set autocommit = 0
禁止自动提交
set autocommit = 1
开启自动提交
但要注意当用set autocommit = 0
的时候,以后所有的sql都将作为事务处理,直到commit确认或rollback结束,注意当结束这个事务的同时也就意味着同时开启了另一个事务,而按第一种方法只将当前的作为一个事务。
四、事务隔离级别
1、读未提交
1、脏读
A事务在开始执行之后并未提交数据,但是B事务却可以读到并未提交的数据,此时B事务就读到了一条“脏数据”,也叫做脏读。
2、幻读
事务A:查询数据并打印结果
事务B:在查询数据完之后,打印账单前,又对数据进行了修改
此时事务A就了事务B修改过后的数据,与之前查询的数据不相符,以为出现了幻觉。
3、不可重复读
事务A:查询数据
事务B:修改数据
事务A在查询完数据之后,事务B对数据进行了修改,此时事务A再去查询数据就得到的是事务B修改之后的数据。这就叫不可重复读。
2、读提交
1、防止脏读
2、可能会出现幻读
3、可能会出现不可重复读
3、可重复性读
1、可能出现幻读
2、防止不可重复读
事务A:查询数据,并打印账单
事务B:在打印账单的过程中,又对数据进行了更新
而在该级别下,在事务A开启时,数据库就会生成一个view(视图),后续事务A再对数据进行操作时就只是在操作view视图,并不是实际的数据库。而事务B是直接对数据库中的数据进行修改的。
4、串行化
可以防止脏读、幻读、不可重复读
事务A:更新数据
事务B:更新数据
在该级别下,会为每个数据库中的表都加上一把锁,A事务执行不完是不能执行B事务的。
缺点:在一个时间点只能有一个事务去访问表,从而降低了效率。
MySQL默认的隔离级别:可重复读
Oracle默认的隔离级别:读已提交
5、查看隔离级别
show variables like 'transaction_isolation';
6、修改隔离级别
SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL
{READ UNCOMMITED|READ COMMITED|REPEATABLE READ|SERIALIZABLE}