事务

来源:互联网 发布:淘宝网和天猫的关系 编辑:程序博客网 时间:2024/06/06 07:04

事务就是一组原子性的SQL查询,或者说是一个独立的工作单元。

事务内的语句,要么全部执行成功,要么全部执行失败。

一个运行良好的事务必须具备ACID这些标准特性,ACID表示原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。

一致性:数据库总是从一个一致性的状态转换到另外一个一致性的状态。

隔离性:一个事务所做的修改在最终提交之前,对其他事务是不可见的。

持久性:一但事务提交,则其所做的修改就会永久保存到数据库中。


隔离性的四种隔离级别

1.READ UNCOMMITTED(未提交读):在这个级别,事务中的修改,即使没有提交,对其他事务也是可见的。事务可以读取未提交的数据,这也被称为脏读(Dirty Read),     在实际应用中一般很少使用。

2.READ COMMITTED(提交读):大多数数据库系统的默认隔离级别都是READ COMMITTED(但MySQL不是)。一个事务从开始直到提交之前,所做的任何修改对其他事务都是不可见的。这个级别也叫作不可重复读(norepeatable read)。

3.REPEATABLE READ(可重复读):REPEATABLE READ解决了脏读的问题。该级别保证了在同一个事务中多次读取同样记录的结果是一致的。但无法解决幻读的问题。所谓幻读指的是当某个事务在读取某个范围内的记录时,会产生幻行(Phantom Row)。InnoDB和XtraDBM存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)解决了幻读的问题

可重复读是MySQL的默认隔离级别。

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


自动提交(AUTOCOMMIT):MySQL默认采用自动提交模式,如果不是显示的开始一个事务,则每个查询都被当做一个事务执行提交操作。可以通过深圳AUTOCOMMIT变量来启用或者禁用自动提交模式。

mysql> show variables like'autocommit';

1或者ON表示启用,0或者OFF表示禁用

执行完mysql>set autocommit=0;

修改AUTOCOMMIT对非事务型的表,比如MyISAM或者内存表,不会有任何影响。对于这类表来说,没有COMMIT或者ROLLBACK的概念,也就是说相当于一直处于AUTOCOMMIT启用的模式。


MySQL可以通过SET TRANSACTION ISOLATION LEVEL命令来设置隔离级别。新的隔离级别会在下一个事务开始时生效。可以在配置文件中设置整个数据库的隔离级别,也可以只改变当前会话的隔离级别:mysql>set session transaction isolation level read committed;InnoDB引擎支持所有的隔离级别。


0 0
原创粉丝点击