关于事务总结
什么是事务?
事务一般特指数据库事务,是指作为一个程序执行单元执行的一系列操作,要么全部执行,要么全不执行。
事务就是在数据库中管理维护数据(执行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事务处理
下一篇介绍