事务(Transaction)
2016-11-14 10:31:27 0 举报
AI智能生成
事务是数据库管理系统执行过程中的一个单元,由一个或多个操作组成。这些操作要么全部成功,要么全部失败,不会出现部分成功部分失败的情况。事务具有原子性、一致性、隔离性和持久性四个特性,通常简称为ACID特性。原子性是指事务中的所有操作要么全部完成,要么全部不完成;一致性是指事务必须使数据库从一个一致性状态转换到另一个一致性状态;隔离性是指事务之间不会互相干扰;持久性是指一旦事务提交,其对数据库的修改就是永久性的。事务的这四个特性确保了数据库在并发访问时能够正确地和高效地执行。
作者其他创作
大纲/内容
概念
作用
1、为数据库操作提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
2、当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
特性
原子性
:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。
一致性
事务在完成时必须保持数据的一致性
隔离性
多个事务并发执行时,一个事务的执行不应影响其他事务的执行。
持久性
一个事务一旦提交,他对数据库的修改应该永久保存在数据库中。
隔离级别
默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一个事务设置隔离级别。
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
可序列化
此级别下运行的事务是完全隔离的,不会受到其他事务的干扰(因此不会出现任何“读现象”)。
Serializable 的时候,虽然可以避免所有并发访问的问题,但是 Serializable 采用的是单线程来解决并发访问的问题,也就是说在某一段时间内,只能有一个用户对数据库进行操作,导致其它用户阻塞。导致数据库的访问性能很差。
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。SERIALIZABLE 事务隔离级别最严厉,在进行查询时就会对表或行加上共享锁,其他事务对该表将只能进行读操作,而不能进行写操作。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
子主题
可重复读
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。
幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
子主题
提交读
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。
它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
这种隔离级别 也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一 select 可能返回不同结果。
它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。
这种隔离级别 也支持所谓的不可重复读(NonrepeatableRead),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一 select 可能返回不同结果。
在一个事务修改数据过程中,如果事务还没提交,其他事务不能读该数据。
子主题
未提交读
一个事务可以读到另一个事务未提交的数据
事务在读数据的时候并未对数据库加锁
在该隔离级别,所有事务都可以看到其他未提交(commit)事务的执行结果。
本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
读取未提交的数据,也被称之为脏读(Dirty Read)。
本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。
读取未提交的数据,也被称之为脏读(Dirty Read)。
未提交读会导致脏读
读现象
概念:“读现象”是多个事务并发执行时,在读取数据方面可能碰到的状况。
类型
幻读
eg:财务部将小明这个月薪水6000元打入小明账户,小明看到非常高兴,这时候财务部发现打错了,应该是2000元,回滚事务,给小明工资改成2000,小明空欢喜一场。
不可重复读
还是将一条 SELECT 语句执行两次,某个特定的条目在这两次查询中返回的值不一样,就叫“不可重复读”。
SELECT id, name FROM test; => (1,"n1"), (2, "n2), (5, "n5")
SELECT id, name FROM test; => (1, "n1"), (2, "David"), (5, "n5")
注意,返回的仍然是主键为 1,2,5 的数据,但 id=2 的那行数据的 name 变了
这种情况的原因是:在第二次 SELECT 前,其它事务对此条目进行了 UPDATE,并进行了提交。
脏读
脏读发生的前提是一个事务能读到其他事务中未提交的操作。
如果在读取到这样的数据后,那个事务进行了回滚,我们就相当于读到了数据库中不再存在的数据(也就是“脏数据”)。
这三种读现象是并列、互不相关的,例如在某个隔离等级中出现了“不可重复读”,并不意味着就一定也能出现“幻读”。
锁机制
概念:当并发事务同时访问一个资源时,有可能导致数据不一致,因此需要一种机制来将数据访问顺序化,以保证数据库数据的一致性。锁就是其中的一种机制。
下回分享
敬请期待。。。。。。。
0 条评论
下一页