码迷,mamicode.com
首页 > 数据库 > 详细

mysql 事务

时间:2020-05-27 20:16:18      阅读:93      评论:0      收藏:0      [点我收藏+]

标签:next   llb   set   客户端   account   database   不同   isolation   开始   

事务ACID

* 原子性(atomicity)一个事务必须被视为一个不可分割的最小工作单元,整个事务中所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作

* 一致性(consistency)数据库总是从一个一致性的状态转换到另外一个一致性的状态,保持完整性约束。

* 隔离性(isolation)一个事务所做的修改在最终提交以前,对其他事务是不可见的

* 持久性(durability)一旦事务提交,则其所做的修改就会永久保存到数据库中

 

四种隔离级别

* READ UNCOMMITTED(未提交读),事务中的修改,即使没有提交,对其他事务也都是可见的,

* READ COMMITTED(读已提交),大多数数据库系统的默认隔离级别,事务中的修改在提交前对其他事务不可见。也叫不可重复读,有可能出现幻读

* REPEATABLE READ(可重复读),是InnoDB的默认事务隔离级别,标准的RR,不能解决幻读问题,但InnoDB的RR实现和标准不同,通过next-key和mvcc解决了幻读问题

* SERIALIZABLE(可串行化)最高级别,通过强制事务串行执行,避免了幻读问题,会在读取的每一行数据上都加锁,可能导致大量的超时和锁争用的问题

 

 

丢失更新:A回滚时,把B已提交的数据丢失掉,X锁或业务层mvcc mvcc貌似不行?

覆盖更新:A提交时,把B已提交的数据覆盖掉,读-改-写

解决办法:原子写,set v=v+1,或者X锁或业务层mvcc

脏读:事务A里读到未提交的事务B内修改后的值,然后B回滚,或者B改了多条记录,A只读了部分

隔离级别 read uncommitted

之所以会出现脏读,是因为B修改后提交前就释放了X锁,

RC解决脏读的方法就是B提交后才释放X锁,提交前也可以读,读的是修改前的快照

不可重复读:事务A里第一次读数据后,事务B修改了该数据并提交,

事务A第二次读该数据和第一次不一样。隔离级别 read committed

幻读:事务A里第一次读数据,select .. where id<7,事务B添加id=5的数据并提交,

事务A再读数据,会读到id=5的数据。隔离级别 read committed

在标准的RR下,A再次读数据,即使读不到id=5,A想添加id=5的数据也是会失败的

或者A对满足读条件的一堆数据进行修改,逐条写回数据库,

再次检查数据,会发现有满足条件且未修改的数据

而在innoDB的RR实现下,事务A通过加X锁:select .. where id<7 for update,

可以锁住区间(负无穷,7),阻止B添加数据,从而避免幻读

 

 

关于mvcc、RR、幻读、锁的一些文章:1 2 3 4 5 6 7

  

 

事务日志

存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志持久以后,内存中被修改的数据在后台可以慢慢地刷回到磁盘,称为预写式日志(Write-Ahead Logging)

 

set autocommit =0; //开启事务方法1 禁止自动提交

start transaction; //开始事务方法2 A连接 进行转账操作

update account set accmoney = accmoney -1000 where aid =1;

update account set accmoney = accmoney +1000 where aid =2;

commit; //显式提交

 

事务回滚

start transaction;

...

rollback; 回到事务开始时的状态

commit;

 

commit and chain; //提交 并新开一个事务

rollback and release; 回滚之后断开和客户端的连接

 

还原点

start transaction;

update...;

savepoint s1;

insert...;

savepoint s2;

rollback to savepoint s1;

release savepoint s8 删除还原点

 

设置隔离级别

set transaction:

 

mysql 事务

标签:next   llb   set   客户端   account   database   不同   isolation   开始   

原文地址:https://www.cnblogs.com/ts65214/p/12976127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!