SQL事务
事务概念
事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,
这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。
例如:订票、银行、保险公司以及证券交易系统等。
事务执行是一个整体,所有的SQL语句必须全部执行成功,如果其中有一条SQL语句出现异常,则所有的SQL语句都要回滚,整个事务执行失败。
操作
1.开启事务:start transaction;
2.回滚:rollback
3.提交:commit
事务提交的方式
自动提交
一条DML语句回自动提交一次事务,一条sql代码就会提交(mysql是自动提交)
手动提交
需要先开启事务:start Transaction,再提交
修改事务的默认提交方式
@@autocommit —1代表自动提交 0代表手动提交
set @@autocommit =0; ————有些数据库是默认手动提交Oracle
手动提交后面要加一个commit;
事务的四大特征(ACID)
- 原子性Atomicity:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
- 一致性Consistency: 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
- **隔离性Isolation:**数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
- **持久性Durability:**事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务隔离级别
事务隔离是数据库处理的基础之一。隔离是缩写ACID中的I ;
隔离级别是一种设置,用于在**多个事务同时进行更改和执行查询时微调性能与结果的可靠性**,一致性和可重复性之间的平衡。
InnoDB
报价由SQL描述的所有四个事务隔离级别:1992标准:
READ UNCOMMITTED
, READ COMMITTED
, REPEATABLE READ
,和 SERIALIZABLE
。默认隔离级别InnoDB
是 REPEATABLE READ
。
读取数据可能出现的问题
脏读——读取了未提交的脏数据
脏读就是指当**一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据**,依据脏数据所做的操作可能是不正确的。
不可重复读——读取的过程被另外一个事务修改了数据,导致读了两次不同数据
在一个事务内,多次读同一个数据。在这个事务还没有结束时,另一个事务也访问该同一数据并修改数据。那么,在第一个事务的**两次读数据之间。由于另一个事务的修改,那么第一个事务两次读到的数据可能不一样**,这样就发生了在一个事务内两次读到的数据是不一样的,因此称为不可重复读
幻读(Phantom Read):
在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。
事务隔离级别
1.read uncommitted :读未提交 *产生的问题:脏读、不三重复读、幻读
- read committed :读已提交 (Oracle) *产生的问题:不可重复读、幻读
- repeatable read :可重复读(MySQL默认) *产生的问题:幻避
- serializable :串行化 *可以解决所有的问题
* 注意:隔离级别从小到大安全性越来越高,但是效率越来越低