一、事务的概念
一个事务是由一条或多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中所有操作都正常履行完了,全部事务才会被提交给数据库,如果有部份事务处理失败,那末事务就要回滚到最初的状态,因此,事务要末全部履行成功,要末全部失败。
所以要记住事务几个基本概念,以下:
事务是一组SQL语句的履行,要末全部成功,要末全部失败,不能出现部份成功,部份失败的结果,保证事务履行的原子操作。事务的所有SQL语句全部履行成功,才能提交(commit)事务,把结果写会磁盘上。事务履行进程中,有的SQL出现毛病,那末事务一定要要回滚(rollback)到最初的状态。
比如转账业务需要多条SQL语句共同完成,只有这些SQL都履行成功才算业务成功了。
事务处理有三个状态:
begin:开启一个事务要履行的全部sql语句都成功了,然后commit提交一个事务如果其中任何一条SQL语句由于停电、或服务器出错,致使SQL履行异常,那事务就没有提交,事务会回滚(rollback),数据将恢复到事务开始前的状态
这是存储引擎来保证的(redo log和undo log保证的)
MyISAM存储引擎不支持事务,InnoDB存储引擎支持事务、支持行锁。
用show engines\G
查看当前数据库支持哪些存储引擎。
select @@autocommit;
查看对事务提交状态的设置
数据库引擎可以通过命令临时修改,或通过配置文件永久修改。
如果说我们业务上触及了事务,我们一般会在代码上控制这个变量,一般来讲,我们的事务由多条SQL组成,要满足事务的原子性操作,所以我们设置为手动提交。业务都成功,则提交这个事务;如果业务中间出现失败,就回滚1个事务。
二、ACID特性
每个事务一定要满足下面的4个特性:
事务的原子性(Atomic):事务是一个不可分割的整体,事务一定要具有原子特性,及当事务修改时,要末全履行,要末全不履行,即不允许事务部份的完成。事务的一致性(Consistency):一个事务履行之前和履行以后,数据库数据一定要保持一致性状态。数据库的一致性状态一定要由用户来负责,由并发控制机制实现。就拿网上购物来讲,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完全的事务。(一致性不单单体现在事务里面,包括存储层引入MySQL为了提高热门数据的访问效力一般都会加一个缓存层Redis或Memery cache对热门数据做缓存,这就触及了缓存层和数据库DB层的数据一致性问题)事务的隔离性(Isolution):当两个或多个事务并发履行时,为了保证数据的安全性,将一个事务内部的操作与其他事务的操作隔离起来,不被其他正在履行的事务所看到,使得并发履行的各个事务之间不能相互影响。隔离级别:数据的安全性和事务的并发性。隔离越严格,安全性越高,并发性越低(就是并发控制,保证数据安全)事务的持久性(Durability):事务完成以后(事务commit成功),DBMS保证它对数据库中的数据的修改时永久性的,即便数据库由于故障出错,也应当能够恢复数据。
MySQL最重要的是日志,不是数据!
事务的ACD特性是由MySQL的redo log和undo log机制来保证的;I隔离性是由mysql事务的锁机制来实现保证的。
三、事务并发存在的问题
事务处理不经隔离,并发履行事务时通常会产生以下问题:
脏读(Dirty Read):一个事务读取了另外一个事务未提交的数据。例如当事务A和事务B并发履行时,当事务A更新后,事务B查询读取到A还没有提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据(事务B读取了事务A还没有提交的数据)不可重复读(NonRepeatable Read):一个事务的操作致使另外一个事务前后两次读到区别的数据。例如当事务A和事务B并发履行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再去读该数据,发现前后两次读的数据不一样。(事务B读取了事务A已提交的数据)虚读(Phantom Read)幻读:一个事务的操作致使另外一个事务前后两次查询的结果数据量区别。例如当事务A和事务B并发履行时,当事务B查询读取数据后,事务A新增或删除一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或读不到事务A删除的数据)
脏读一定要杜绝,由于事务没有commit。在有些场景下,不可重复读和幻读是可以允许的(事务已commit),不一定非要杜绝(通过设置区别的隔离级别解决),由利用场景需求决定。
四、事务相关命令
select @@autocommit;
查看MySQL会不会自动提交事务
0表示手动提交事务,1表示自动提交事务,设置事务提交方式为手动提交(只影响当前session):
到此这篇关于MySQL事务的ACID特性和并提问题方案的文章就介绍到这了,更多相关MySQL事务ACID特性内容请搜索之前的文章或继续浏览下面的相关文章希望大家以后多多支持!
文章来源:丸子建站
文章标题:MySQL优化之:MySQL事务的ACID特性和并提问题方案
https://www.wanzijz.com/view/76351.html