事务相关

一、基本概念

  • 事务:也称工作单元,是由一个或多个SQL语句组成的操作序列,这些SQL语句作为一个完整的工作单元,要么全部执行成功,要么全部执行失败。在数据库中,通过事务来保证数据的一致性。

  • 事务处理语言:Transaction Process Language,简称TPL,主要用来对组成事务的DML语句操作结果进行确认或取消。确认也就是使DML操作生效,使用提交(COMMIT)命令实现;取消也就是使DML操作失败,使用回滚(ROLLBACK)命令实现。

  • 通过事务的使用能防止数据库中出现数据不一致现象。如两个银行账户转账,涉及到两条更新操作,这两条更新操作只允许全部成功或失败,否则数据会出现不一致的现象。

二、事务的特征

事务特征可用四个字母的缩写表示的:即ACID

原子性(Atomicity)

事务就像“原子”一样,不可被分割,组成事务的DML操作语句要么全成功,要么全失败,不可能出现部分成功部分失败的情况。

一致性(Consistency)

一旦事务完成,不管是成功的,还是失败的,整个系统处于数据一致的状态。

隔离性(Isolation)

一个事务的执行不会被另一个事务所干扰。比如两个人同时从一个账户中取钱,通过事务的隔离性确保账户余额的正确性。

持久性(Durability)

也称永久性,指事务一旦提交,对数据的改变就是永久的,不可以再被回滚。

三、事务处理

MySQL的事务处理主要有两种方法

  1. 用begin,rollback,commit来实现

begin 开始一个事务

rollback 事务回滚 将当前状态回滚到事务开启的状态

commit 事务提交

  1. 直接使用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}
posted @ 2019-09-06 22:31  liliHexiaogou  阅读(203)  评论(0编辑  收藏  举报