一、事物的基本概念
俩个并发事物同时访问数据库中相同的行时,可能会出现以下问题。
脏读:脏读是指事物T1正在访问数据,并修改了数据,还未提交,事物T2访问到了事物T1还未提交的数据,即脏数据。
不可重复读:不可重复读是指在一个事物内,俩次读取同一数据,读取的结果不一致。
幻读:幻读是指事物不是独立执行时发生的一种现象。事物T1读取与搜索条件匹配的若干行,事物T2以删除或者插入等行为方式,然后影响事物T1的结果集然后提交。
更新丢失:当俩个事物或者多个事物选择同一行时,基于最初选定的结果更新改数据时会发生更新丢失。例如事物T1开始,查询到结果A=100,此后事物T2也开始,查询到A=100,事物T2把A设置为90,然后提交。事物T1把A的设置为110,然后提交。这时事物T2的更新就丢失了,基本上任何数据库的任何隔离级别都不允许更新丢失。
三、事物的隔离级别
事物的隔离级别就是指一个事物对数据的修改与另一个事物的隔离程度,也是为了防止上面事物并发时可能产生的问题。在SQL标准中定义了四种隔离级别。
未提交读(READ UNCOMMITTED)
事物可以读取到未提交的事物,也就是可以发生脏读的情况。该隔离级别可能产生脏读,幻读,不可重复读问题。
提交读(READ COMMITTED)
一个事物开始时,只能看见已经提交的事物所做的修改。换句话说,一个事物从开始直到提交之前,所做的任何修改对其它事物都是不可见的。这个级别有时候也叫不可重复读,因为俩次查询的结果可能不一致。该隔离级别可能产生不可重复读取,幻读问题。
可重复读(REPEATABLE READ)
该级别保证了同一事物多次读取同样的记录,结果是一致的。这也是MySQL默认的事物隔离级别。该隔离级别可能产生幻读问题。
可串行化(SERIALIZABLE)
事物的最高隔离级别,它通过强制事物串行执行,避免了事物可能发生的问题。该级别不会发生脏读,幻读,不可重复读取问题,但是并发性能差。
四、事物有关的操作
MySQL中InnoDB存储引擎支持事物操作,当然InnoDB也是最最常用的存储引擎。与事物相关的操作主要包含以下操作
1 开启事物 begin
2 设置保存点 savepoint,只能回滚到保存点,不能提交到保存点。
3 提交事物 rollback
4 回滚事物 commit
5 设置自动提交 set autocommit = 0,禁止自动提交 set autocommit =1;
五 MySql 事物实例
-- 开始事物
BEGIN
update web_bas_area set C_AREA_CNM='中国' where C_AREA_CDE=1;
-- 执行其它业务操作
-- 提交或者回滚事物
COMMIT;-- ROLLBACK
begin;
update web_bas_area set C_AREA_CNM='美国' where C_AREA_CDE=1;
savepoint s1; -- 设置保存点
update web_bas_area set C_AREA_CNM='中国' where C_AREA_CDE=2;
rollback to savepoint s1; -- 回滚到节点S1,即第一句sql好像没执行 注意不能提交某个保存点 ,COMMIT to SAVEPOINT s1 这样写会报错;
commit;