数据库事务
什么是事务:
数据库事务:是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。
通俗理解:事务就是将一堆SQL(通常是增删改操作)的执行绑在一起,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。
事务的4大特性:
原子性:事务中所有操作都是不可分割的原子单位。事务所有操作要么全部执行要么全不执行。
一致性:事务执行后,数据库状态与其他业务规则保持一致。比如转账,无论成功与否,两账户的总金额是不变的。
隔离性:就是指在多个操作时(并发操作),不同的事务之间应该隔离开来,使每一个事务互不干扰。比如从其中一个事务查看另一个事务时,另一个事务查询的结果要么是执行前的,要么是执行后的,不会查询到中间的状态数据。
持久性:一旦事务提交后,事务在的所有数据操作都必须被持久化到数据库中,即使数据库马上崩溃,在重启时也必须保证通过某种机制恢复数据。
MySQL中的事务:
在默认情况下,MySQL每执行一条sql语句就是一个单独的事务,如果需要一个事务中执行多条sql语句,那么需要开启事务和结束事务。
开启事务:start transaction;
结束事务:commit(提交事务)或rollback(回滚事务)。(回滚事务就是回到起点,之前做的所有操作都会失效);
例:
select * from db;
start transaction;--开始事务
.......需要进行的事务sql语句
commit;--事务提交 或 rollback;--事务回滚 或 quit;--中断操作
事务的并发读问题:
脏读:A事务读取B事务,但事务还未提交,然后事务B开始产生脏读,B事务产生错误执行回滚操作,A读取B中的事务,读取到的数据就是脏读。
不可重复读:事务A读取了一条数据,然后执行逻辑的时候,被B事务修改了,然后A再去读取,导致两次读取到的数据不匹配。
幻读(虚读):事务A根据条件查询到了N条数据,然后事务B新增加了符合条件数据,导致A根据条件再去查询的时候,导致查询到的数据比之前的多,就产生了幻读。 (幻读跟不可重复读有些相似)
事务的隔离级别:
read uncommitted (读未提交)安全级别低,可能出现事务并发问题
read committed (读已提交)(Oracle默认) 防止脏读,没有处理不可重复读,幻读
repeatable read(可重复读)(mysql默认)防止脏读和不可重复读,不能处理幻读;
serializable(序列化)(串行化)可以处理脏读,幻读,不可重复读,但是性能最差
原文:https://www.cnblogs.com/donghello/p/12935914.html