目录
一、简述
什么是事务
- 一个或者一组sql语句组成的一个执行单元,这个单元要么全部执行,要么全部不执行,如果执行过程出现问题,则全部回滚。
- 回滚:回到数据操作前的初始状态
存储引擎
- 常用的存储引擎有:innodb,myisam,memory。
- 其中innodb支持事务。
- show engines 查看数据库支持的存储引擎。
ACID属性
- 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
二、创建事务
事务分类
隐式事务:事务没有明显的开启和结束的标记
显式事务:事务有着明显的开启和结束的标记
创建步骤
- set autocommit = 0;
- start transaction;(可选写)
- 语句1;
- 语句2;
- ......
- commit;提交事务
- rollback;回滚事务
- savepoint 节点名 回滚存档点
三、并发处理
问题
- 脏读:两个事务T1,T2,T1读取了T2更新但未提交的数据,若T2回滚,T1读的数据就是临时且无效的。
- 不可重复读:两个事务T1,T2,T1读取了一个字段,T2更新了这个字段,T1再读取这个字段,值就不同了。
- 幻读:两个事务T1,T2,T1读取其中一个字段,T2在表中插入了几行,T1再读表时,就会多几行。
解决办法
隔离级别
- read uncommitted (读未提交数据)(所有并发问题都会出现)
- read committed(读已提交数据)(解决脏读问题)
- repeatable read(可重复读)(mysql默认的)(解决脏读和不可重复读问题)
- serializable(串行化)(解决所有并发问题,但效率很低)
设置隔离级别
- 查看隔离级别 select @@tx_isolation
- 设置隔离级别 set session transaction isolation level 级别
- 设置数据库系统全局隔离级别 set global transaction isolation level 级别