数据库事务
什么是事务:
数据库事务:是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。
通俗理解:事务就是将一堆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根据条件再去查询的时候,导致查询到的数据比之前的多,就产生了幻读。 (幻读跟不可重复读有些相似)
事务的隔离级别:
default 使用数据库设置的隔离级别(默认),由DBA默认的设置来决定隔离级别
read uncommitted (读未提交)安全级别低,可能出现事务并发问题
read committed (读已提交)(Oracle默认) 防止脏读,没有处理不可重复读,幻读
repeatable read(可重复读)(mysql默认)防止脏读和不可重复读,不能处理幻读;
serializable(序列化)(串行化)可以处理脏读,幻读,不可重复读,但是性能最差
锁:
从数据库角度来看,可以分为三种类型:
独占锁:独占锁锁定的资源只允许进行锁定操作的程序使用,其它任何对它的操作均不会被接受。
共享锁:共享锁锁定的资源可以被其它用户读取,但其它用户不能修改它。
更新锁:更新锁是为了防止死锁而设立的。当SQL Server 准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。
从程序员的角度看,锁分为以下两种类型:
悲观锁:悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此在整个数据处理过程中,将数据处于锁定状态。
乐观锁:而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。如果数据已经被其他线程更新,则根据不同的实现方式执行不同的操作(例如报错或者自动重试)。

浙公网安备 33010602011771号