事务
一、什么是事务?
一组SQL语句的集合
二、为什么使用事务?
为了保证数据的完整性。eg:转账
三、什么情况下使用事务?
1、 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
2、事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
3、事务用来管理 insert,update,delete 语句
四、事务的特性(ACID)
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。 1 、原子性 事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做 2 、一致性 事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。 3 、隔离性 一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 4 、持续性 也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响
五、不考虑隔离性可能产生的问题
如果不对数据库进行并发控制,可能会产生异常情况:
现在重点说明下事务的隔离性,当多个线程(或多个客户端)都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。
如果不考虑事务的隔离性,会发生的几种问题:
1 脏读
脏读是指在一个事务处理过程中读取了另一个未提交的事务中的数据。
2 不可重复读
不可重复读是指对于数据库中的某个数据,一个事务内多次查询却返回了不同的数据值,这是由于在事务执行过程中,数据被另一个事务修改并提交了。
3 幻读
幻读是事务非独立执行时发生的一种现象。例如,事务T1对一个表中所有的行的某个字段做了从“1”修改为“2”的操作,这时事务T2又插入了一条新的记录,而该字段的值为“1”并且提交给数据库。这时,操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是产生了幻读。
幻读和不可重复读都是读取了另一条已经提交的事务,所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据(比如数据的个数)。
六、事物的隔离级别
Serializable(串行化):可避免脏读、不可重复读、幻读的发生。(级别最高)
Repeatable-read(可重复读):可避免脏读、不可重复读的发生。
Read-committed(读已提交):可避免脏读的发生。
Read-uncommitted(读未提交):最低级别,任何情况都无法保证。(级别最低)
以上四种隔离级别最高的是Serializable,最低的是Read uncommitted级别。当然,隔离级别越高,执行效率就越低。
MySQL数据库中默认的隔离级别为Repeatable read。
像Serializable这样的级别,就是以锁表的方式(类似于Java多线程中的锁)使得其他的线程只能在锁外等待,选用哪一种隔离级别应该根据实际情况而定。
七、事务控制语句
1、BEGIN或START TRANSACTION;显示地开启一个事务;
2、COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
3、ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
4、SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
八、事务实现的方法
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
九、事务隔离的实现——锁
十、术语
事务(transaction):指一组sql语句
回退(rollback):指撤销指定sql语句的过程
提交(commit):指将为存储的sql语句结果写入数据库表