一、并发控制
原因:在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突。这就是著名的并发性问题。
实现:最常用的处理多用户并发访问的方法是加锁。
当一个用户锁住数据库中的某个对象时,其他用户就不能再访问该对象。
加锁对并发访问的影响体现在锁的粒度上。锁粒度越小,并发访问越好,同时开销相对越大。数据库的锁粒度,例如:数据行、数据表、数据库实例。
二、并发冲突
l 丢失更新(Lost update):一个事务的更新覆盖了其它事务的更新结果。
Two transactions update the same data without locking
l 脏读(Dirty Read):当一个事务读取其它完成一半事务的记录时,就会发生脏读取。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。
Transaction A read uncommitted data
l 不可重复读(Unrepeatable Read):一个事务范围内两个相同的查询却返回了不同数据。这是由于其他事务修改的提交而引起的。
Transaction A executes two nonrepeatable reads
l 幻读(Phantom Read):指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
Transaction A reads new data in the second select
三、数据库事务特性(Transaction ACID)
原子性(atomic): 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态。
一致性(consistency):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。比如a,b账户相互转账之后,总金额不变。
隔离性(isolation):操作中的事务不相互影响。
持久性(durability):事务提交后被持久化到数据库。
四、事务的隔离级别
Isolation 属性一共支持五种事务设置,具体介绍如下:
(1)DEFAULT
使用数据库设置的隔离级别(默认),由DBA 默认的设置来决定隔离级别。
(2)READ_UNCOMMITTED
这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
会出现脏读、不可重复读、幻读 (隔离级别最低,并发性能高)。
(3)READ_COMMITTED
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据。
可以避免脏读,但会出现不可重复读、幻读问题(锁定正在读取的行)。
(4)REPEATABLE_READ
可以防止脏读、不可重复读,但会出幻读(锁定所读取的所有行)。
(5)SERIALIZABLE
这是花费最高代价但是最可靠的事务隔离级别,事务被处理为顺序执行。
保证所有的情况不会发生(锁表)。
参考:
http://www.cnblogs.com/adforce/archive/2011/04/20/2021929.html
http://blog.csdn.net/bluishglc/article/details/5626009
http://www.cnblogs.com/Bob-FD/p/3352216.html
转载于:https://www.cnblogs.com/ppp21spider/p/5221464.html