事务
2015-09-14 21:10
316 查看
事务就是一组原子性的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引擎支持所有的隔离级别。
事务内的语句,要么全部执行成功,要么全部执行失败。
一个运行良好的事务必须具备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引擎支持所有的隔离级别。
相关文章推荐
- Intellij idea 第一天
- [c] poj2524 并查集
- 一个好的截图软件
- 基于第三方QQ授权登录和新浪微博授权登录的iOS代码分析
- hdu 5446 Unknown Treasure(Lucas定理+中国剩余定理)
- 去掉导航栏下的分割线的方法
- Ubuntu下安装android studio的时候,无法进入图形界面--/usr/lib/jdk1.8.0_60/jre/lib/i386/libawt_xawt.so: libXtst.so.6: 无法打开共享对象文件: 没有那个文件或目录
- [PHP动态]0001.关于 PHP 7 你必须知道的五件事
- Seafile服务器配置
- OpenGL 第一课
- jQuery登录界面,不用跳转页面即可提交post,可以从服务器端获取返回数据
- uva 658 It's not a Bug, it's a Feature! 最短路
- 快速安装cocoapods
- eclipse在centos下面崩溃
- 树莓派扩展root分区
- hdu 1528 Perfection(数论·因子和·C++·java)
- 机器人书单与学习资源——导航篇
- iOS7自带扫描二维码、条形码功能实现
- 建立第一个窗体
- php echo/print