事务
事务(Transaction)指的是一个操作序列,该操作序列中的多个操作要么都做,要么都不做,是一个不可分割的工作单位,比如A转账100元给B,A账户减少100元,B账户增加100元,这就叫事务,要么转账成功,这两个操作都成功,要么转账失败,AB都账户都没有增减,不会出现A减少了100元而B账户没有增加的情况;
原子性(Atomicity)
事务里的操作不可再拆分,事务里的所有操作可以看成一个原子,原子是最小的颗粒,具有不可再分的特性,要么全部执行,要么全不执行;
一致性(Consistency)
一致性是通过原子性来保证的,是指事务执行的结果必然是从一个一致性状态到另一个一致性状态,比如转出的金额和转入的金额一致才能构成事务;
隔离性(Isolation)
隔离性是指各个事务之间互不干扰;
持久性(Durability)
持久性是指事务一旦提交,对数据所做的任何改变,都要记录在永久的存储器中;
事务案例
创建账户表并插入数据
create table account(
id int(10) primary key auto_increment,
uname varchar(10) not null,
balance double(10,2)
);
insert into account values (null,"张三",2000),(null,"李四",2000);
进行转账操作,张三减200,李四加200
//转账操作
update account set balance = balance - 200 where id = 1;
update account set balance = balance + 200 where id = 2;
注意:这时的数据时存在内存中的,如果这时转账有误则需要回滚操作
rollback;
确认无误则提交操作
commit;
事务并发问题
脏读
当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,此时另一个事务也访问了这个数据,然后也使用了这个数据,但此时的数据时还没有提交前的数据,那么另一个事务读到的这个数据是"脏数据",依据"脏数据"所做的操作有可能是不正确的;
不可重复读
指在一个事务内多次读同一个数据,此时另一个事务正在修改该数据,当一个事务再读取该数据时,两次读取到的数据可能不一样,因为被称为不可重复读;
幻读
幻读和不可重复读类似,一个事务读取了几行数据,另一个事务此时插入了一些数据,随后当第一个事务再读时会发现多了几行数据,就像发生幻觉一样;
幻读和不可重复读的区别
幻读重点在于新增和删除,不可重复读的重点是修改;
幻读解决需要锁住整表,而不可重复读需要锁住满足条件的行;
事务的隔离级别
-
READ UNCOMMITTED 读未提交的
可能出现脏读,不可重复读,幻读; -
READ COMMITTED 读提交的
可能出现不可重复读,幻读; -
REPEATABLE READ 重复读(用的最多)
可能出现幻读; -
SERIALIZABLE 序列化
解决所有并发问题