MySql事务详解

来源:互联网 发布:cf手雷威力排行 数据 编辑:程序博客网 时间:2024/06/17 01:15

什么是事务?

事务就是一组原子操作,事务的特点是ACID,表示atomic原子性,consistency一致性,isolation隔离性,durability持久性。

原子性:一个事务必须被视为一个不可分割的最小单元,整个事务中要们全部执行,要么全部失败回滚。不可能单独执行一部分。
一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态。要么全部执行成功,要么出现一个失败全部失败,所有的状态必须一致性。
隔离性:一个事务所做的修改在最终提交之前,对其他的事务是不可见的。
持久性:一旦事务提交,则其所做的修改就会永久保存到数据中。此时即使系统崩溃,修改的数据也不会丢失。

事务的ACID特性在一定的程度上保证了我们的安全。但是在一定程度上回增加我们数据库系统的开销。一个实现了ACID的数据库需要更强的CPU处理,更大的内存和更多的磁盘空间。所以需要我们引擎来提升效率。

隔离级别

在SQL的标准中定义了四种隔离级别:
1。未提交读:
在READ UNCOMMITTED级别,事务中的修改,即使没有提交,对其他事务是可见的。
2。提交读:
大多数数据库系统默认隔离级别都是提交读。提交读满足前面提到的隔离性的简单定义:一个事务开始时只能“看见”已提交事务所做的修改。但是会出现脏读,在同一个事务中连续查询两次有可能会得到不一样的结果。
3。可重复读:
可重复读中不会出现脏读,但是会出现幻读。指当某个事物在读取某个范围的记录时,另外一个事务又在范围内插入了新的记录,当之前的事务再次读取该范围的记录会产生换行。
4。可串行化:
它通过强制事务串行执行,避免了前面说的幻读的问题。
1.3.2死锁
死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。当多个事务试图以不同的顺序锁定资源时,就可能会产生死锁。
为了解决死锁问题,数据库系统实现了各种死锁检车和死锁超时机制。越复杂的系统比如InnoDB存储引擎,越能检测到死锁的循环依赖,并立即返回一个错误。这种解决方式很有效,否则死锁会导致出现非常慢得查询。还有一种解决方式,就是当查询的时间达到锁等待超时的设定后放弃请求,这种方式不太好。InnoDb目前处理死锁的方式是,将持有最少行级排他锁的事务回滚。

锁的行为和顺序是存储引擎相关的。以同样的顺序执行语句,有些存储引擎会产生死锁,有些则不会。死锁的产生有双重原因:有些是因为真正的数据冲突,这种情况通常很难避免,但有些完全是由于存储引擎实现方式导致的。

MySQL中的事务

MySQL提供了两种事务型的存储引擎:InnoDB和NDB Cluster。另外还有一些第三方存储引擎也支持事务。

自动提交

MySql默认采用自动提交模式。也就是说,如果不是显示地开启一个事务,则每个查询都被当作一个事务执行提交操作。 在Mysql中可以通过设置AUTOCIMMIT变量来启用或者禁用自动提交模式。
这里写图片描述
1或者ON表示启用,0或者OFF表示禁用。当AUTOCOMMIT=0时,所有的查询都是在一个事务中,直到显示地执行COMMIT提交或者ROLLBACK回滚,该事务结束,同时又开始了另外一个新的事务。修改AUTOCOMMIT对非事务型的表,比如MyISAM或者内存表,不会有任何影响。这类表来说,没有 COMMIT或者ROLLBACK的概念。

另外还有一些命令,在执行之前会强制执行COMMIT提交当前的活动事务。

MySQL可以通过执行SET TRANSACTION ISOLATION LEVE命令来设置隔离级别。新的隔离级别在下一个事务生效。、

在事务中混合使用引擎

MySQL服务器层不管理事务,事务是由下层的存储引擎实现的。所以在同一个事务中,使用多种存储引擎是不可靠的。

如果在事务中混合使用了事务型和非事务性的表(例如InnoDB和MyISAM),在正常提交的情况下不会有什么问题。

如果需要回滚,非事务型的表上的变更就无法撤销,这会导致数据库处于不一致的状态,这种情况很难修复,事务的最终结果无法确定。

0 0