数据库中的事务是可以并发执行的,由此带来四种并发问题:
一、丢失更新 update lost
1.回滚丢失 事务A修改X, 事务B修改X, 事务B回滚,事务A提交。结果:事务A的修改丢失了
2.覆盖丢失 并发的事务A和A'执行同样的任务, A读取X, B读取X, A将X+1写回,A'将X+1写回。结果:X应为X+2,实际却为X+1
二、脏读取 dirty read
事务A修改数据X(此时A没有commit),事务B读取X,事务A回滚。 结果 : 事务B读取的X不准确
三、不可重复读 Non-Repeatable Read
事务A读取数据X ,事务B修改数据X ,然后事务A再读该数据,结果:事务A两次读取的数据不一致。
四、幻想读 Phantom Read 读取的数据集未改变,但是条件数据集改变,造成事务A两次读取的数据不一致。
解决方案:
Sql标准隔离级别
|
Dirty Read
|
NonRepeatable Read
|
Phantom Read
|
Read uncommitted
|
Possible
|
Possible
|
Possible
|
Read committed
|
Not possible
|
Possible
|
Possible
|
Repeatable read
|
Not possible
|
Not possible
|
Possible
|
Serializable
|
Not possible
|
Not possible
|
Not possible
|
Serializable 全序列化 提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
Repeatable Read 可重复读取 禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。
Read Committed 授权读取 允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。
Read Uncommitted 未授权读取 允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。
隔离级别的实现原理:
………………
其他相关知识
事务定义:是指作为单个逻辑工作单元执行的一系列操作。要么全部执行,要么全部不执行。
事务四种属性: ACID 原子性、一致性、隔离性和持久性
A : 要么全都执行,要么全都不执行
C: 所有的数据都保持一致状态 账户A转出100$给账户B , 保证账户A -100$,账户B +100$
I: 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。数据查看可串行。
D:事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。
参考资料:
http://blog.csdn.net/yongyuana01/archive/2009/02/25/3936482.aspx
http://epub.itpub.net/3/4.htm
http://baike.baidu.com/view/1298364.html?fromTaglist
阅读全文
类别:技术天地 查看评论