mysql事务(三)
一、概述
mysql 事务通常用来处理操作量大、复杂度高的数据;比如,我们在操作商品的时候,每个商品都是有分类的,如果我们将商品分类删除掉了,重新建了一个,但是之前分类下的商品还要在新建的分类下边,那边和其绑定的对应关系,就要在每个商品中去更新了,这时候操作量就会比较的大了,因此,事务更多的会用在数据的维护中;多用来管理 insert、update、delete 语句;
事务处理可以用来维护数据库的完整性,保证成批的 sql 语句要么全部执行生效,要么全部不生效;
在 mysql 中只有使用了 InnoDB 数据库引擎的数据库或者表才支持事务;
二、事务的性质
一般事务通常必须满足四个条件(ACID): 原子性(A:atomicity,也叫作不可分割性)、一致性(C:consistency)、隔离性(I:isolation,也叫做独立性)、持久性(D:durability);
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,中间如果出错的话,就会被回滚(rallback)到最初的状态;
一致性:在事务开始之前和结束之后,数据库的完整性没有也不会被破坏,也就是说在我们进行操作的时候,比如写入,我们必须按照之前数据库表等预定好的一些规则去执行,不能随便的去更改或者传递不符合规则的数据;
隔离性:每个事务在处理的过程中都是独立的,假如有多个事务并发执行的话,每个事务之间是不会相互干扰的;事务隔离又分为四个不同的等级:未提交(read uncommited)、读提交(read committed)、可重复读(repeatable read)、串行化(serializable)。(在这里有一个问题,多个并发事务同时执行的话,假如存在修改和读写的话,先开始的事务是修改,那么在读的时候,假如读在修改之前,那么读出来的数据是修改前的还是修改后的,这个内部的操作机制是什么样的呢?)
持久性:事务处理结束后,对数据的处理包括修改将会是永久性的,即使系统故障也不会丢失;
(1)、事务的隔离性原理
数据库事务会造成脏读、不可重读读以及幻影读等问题;其中,脏读是指事务还没提交,但是数据库的修改已经被其他的事务语句给读到了;不可重复读是指在同一个事务中,两个相同的 sql 读取的内容可能不同;幻影数据是指同一个事务可能突然读出一条其他事物临时写入的一条数据;
事务的隔离是通过锁机制实现的,不同于MyIsam使用表级别的锁,InnoDB 采用更细粒度的行级别锁,提高了数据表的性能;InnoDB 通过锁定索引来实现,如果查询条件中存在主键则锁定主键,如果索引和主键同时存在的话,就先锁定索引,然后再锁定索引对应的主键(形成死锁),如果索引和主键都没有的话就会锁定整张数据表。
三、事务控制语句
(1)、begin 或者 start transaction:显示的开启一个事务;
(2)、commit 或者 commit work:提交事务,并使已对数据库进行的所有修改成为永久性的;
(3)、rollback 或者 rollback work:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
(4)、savepoint identifier:savepoint 允许在事务中创建一个保存点,一个事务中可以有多个savepoint;
(5)、release savepoint identifier:删除一个事务的保存点,当没有指定的事务保存点时,执行该语句会抛出异常;
(6)、rollback to identifier:把事务回滚到保存点;
(7)、set transaction:用来设置事务的隔离级数;
四、mysql 事务处理的几种方法
(1)、用 begin、rollback、commit 来实现;
(2)、直接用 set 来改变 mysql 的自动提交模式; 例如: 开启自动提交set auto_commit = 1; 禁止自动提交 set_commit = 0;