关于事务总结

Posted xzwu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于事务总结相关的知识,希望对你有一定的参考价值。

什么是事务?

事务一般特指数据库事务,是指作为一个程序执行单元执行的一系列操作,要么全部执行,要么全不执行。

事务就是在数据库中管理维护数据(执行sql增删改查)的规则,有的比较简单一条sql就完成,有的比较复杂,需要分成若干条sql,一步一步完成。

事务的四大特性

1.原子性:一个事务是不可分割的工作单位

比如:订单生成需要 a.往订单表中插入一条记录 b.修改商品表中库存数。 a和b必须全部正常执行才可以。如果中间一条sql执行出了问题,那么之前所有的sql必须还原为以前的样子

所以原子性是指在结构上,机制上,相当于从语法上进行处理。

2.一致性:事务必须是使数据库从一个一致性状态转变为另一个一致性状态

比如:还是订单生成需要 a.往订单表中插入一条记录 b.修改商品表中库存数。购买了10件编号为00001的商品,a将订单表中插入了一条数量为10的记录,而b将库存中的数量减去1,这样就不匹配了,不符合业务规则了

所以一致性是指在业务角度确保事务是否合理,可能性比较多。

3.隔离性:一个事务的执行不能被其他事物干扰

比如:我要修改编号为00001的数量是,另一个事务已经把编号为00001的商品删除,就不能一致了。

4.持久性:一个事务,一旦提交,他对数据的改变应该是永久的

也就是说一旦提交,数据是从缓存保存到了磁盘中的,即使断电后,也不会消失

事务的四大特性简称为ACID(atomicity,consistency,isolation,durability)

mysql事务处理:

只有Innodb数据引擎才支持事务(还有外键也是)

查看mysql的引擎 show engines

修改mysql默认引擎 default-storage-engine=Innodb --my.ini中修改

Mysql默认以自动提交模式运行

BEGIN(Start Transaction) 开启一个事务

COMMIT提交事务,并使已对数据库进行的所有修改变为永久性

ROOLBACK回滚事务,并撤销所有正在进行的未提交的修改

Mysql事务并发问题

脏读

事务A:---------将商品编号为00001库存改为0------------------------------------------------回滚(假设有100个)----------------------------------

事务B:-----------------------------------------------------读取编号为00001的商品库存0------------------------------------------------------------------

不可重复读

事务A:--------读取商品编号为00001的库存为100--------------------------------------------------------------------------再次读取00001库存为0--

事务B:-------------------------------------------------------将编号为00001的商品库存改为0--------  提交  ---------------------------------------------

幻读

事务A:----------将所有的商品库存改为0------------------------------------------------------------------查看修改结果仍然有一个商品库存为100---

事务B:-----------------------------------------------插入一个库存为100的新商品--------提交-------------------------------------------------------------

在web中,由于在不同的客户端执行的事务,每一个session自己操作的内存空间是独立的,不允许相互取操作(读取),只能读取永久性的数据,就解决了脏读的问题,这也是所谓的会话独立

不可重复读通过锁行来解决

幻读通过锁表来解决

Mysql事务隔离级别

        脏读  不可重复读  幻读

读未提交    是    是      是

读已提交    否    是      是

可重复读      否    否      是

串行化       否         否      否

查询默认隔离级别 select @@tx_isolation

设置隔离级别 setsessiontransactionisolationlevel ‘XXX‘

Spring事务处理

下一篇介绍

 

以上是关于关于事务总结的主要内容,如果未能解决你的问题,请参考以下文章

关于开源分布式事务中间件Fescar,我们总结了开发者关心的13个问题

关于PROPAGATION_NESTED的理解

关于分布式事务

嵌套事务总结

嵌套事务总结

关于分布式事务两阶段提交协议三阶提交协议