MySQL事物总结

一、事物的基本概念

  事物是数据库系统工作的一个逻辑单元,它由一个或多个SQL组成。对于数据库而言数据库事物是不可分割的工作单元。一个事物内的SQL语句要么全部执行,要么全部不执行,如果其中有任何一条语句无法执行,那么所有的语句都不会执行。事物有以下基本特性。
原子性(automicity)
一个事物必须被视为一个不可分割的最小单元,整个事物中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事物而言不可能只执行其中的一部分这就是事物的原子性。
一致性(consistency)
数据库总是从一个一致性状态转移到另一个一致性状态。因此当数据库中只包含成功提交的事物时就说数据库处于一致性状态,如果数据库运行中发生故障,一个事物只有部分执行结果写入到数据库中,这时数据库就处于一种不一致的状态。
隔离性(isolation)
事物之间的操作都是彼此独立透明的。
持久性(durability)
一旦事物提交,则其它所做的所有操作都会永久的保存到数据库中。接下来即使系统崩溃,已经修改的数据也不会丢失。

 二、并发事物可能导致的问题

俩个并发事物同时访问数据库中相同的行时,可能会出现以下问题。

脏读:脏读是指事物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;






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值