SQL事务

来源:互联网 发布:遗传算法实现代码 编辑:程序博客网 时间:2024/06/06 13:04

参考:http://www.cnblogs.com/boylxz/archive/2010/01/06/1640480.html

事务概念

事务是一种机制、是一种操作序列,它包含了一组数据库操作命令,这组命令要么全部执行,要么全部不执行。因此事务是一个不可分割的工作逻辑单元。在数据库系统上执行并发操作时事务是作为最小的控制单元来使用的。这特别适用于多用户同时操作的数据通信系统。例如:订票、银行、保险公司以及证券交易系统等

事务属性

事务四大属性:
1.原子性(Atomicity):事务是一个完整的操作
2,一致性(Consistency):当事务完成时 ,数据必须处于一致状态
3:隔离性(Isolation)对数据修改的所有并发事务是彼此隔离的
4:持久性(Durability)事务完成后,它对系统的影响是永久性的

创建事务

T-SQL 中管理事务的语句
1,开始事务:begin transaction
2,提交事务 :commit transaction
3,回滚事务:rollback transaction

事务分类

1)显式事务:用begin transaction 明确指定事务的开始
2)隐式事务:打开隐式事务:set implicit_tansactions on,当以隐性事务模式操作时,SQL Server 将在提交或回滚事务后自动启动新事务。无法描述事务的开始,只需要提交或回滚事务。
3)自动提交:默认模式,将每条sql 语句视为一个事务。如果成功执行,则自动提交,否则会滚

MySql 的四种隔离级别
SQL 标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离一般支持更高的并发处理,并拥有更低的系统开销。

1)Read Uncommitted(读取未提交内容)
在该隔离级别,所有的事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能并不比其他级别好多少。读取未提交的数据,也被称为脏读(DIrty Read)
2)Read Committed(读取提交内容)
这是大多数数据库系统的默认隔离级别(不是MySql默认的)。他满足了隔离的简单定义:一个事务只能看到已经提交的事务所做的改变。这种隔离级别会不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例的处理期间可能会有新的commit,所以同一select 可能会返回不同的结果。
3)Repeatable Read(可重读)
这是MySql 的默认事务隔离级别,它保证同一事务的多个实例在并发读取数据时,会看到同样的数据行。理论上会导致幻读(Phantom Read)。幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影行”
InnoDB 和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrent Control)机制解决了该问题。
4)Serializable(可串行化)
最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。但是这个级别,可能导致大量的超时现象和锁竞争。

这四种隔离级别分别采用不同的锁类型来实现,若读取的是同一数据,有可能发生以下的问题:

脏读(Drity Read):某个事物已更新一份数据,另一个事务在此时读取了同一份数据,如果前一个RollBack 了操作,则后一个事务所读取的数据就会是不正确的

不可重复读(Non-repeatable Read):在一个事务之中的两次查询之中数据不一致,这可能是两查询过程中插入了一个事务更新的数据

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据是它前面没有的。

这里写图片描述

原创粉丝点击