日期:2014-05-16  浏览次数:20518 次

数据库事务与并发【转】

数据库事务中的基本概念?

数 据库事务是指,由一个或多个SQL语句组成的工作单元,这个工作单元中的SQL语句相互依赖,如果有一个SQL语句失败,那么整个操作都要撤销。在并发环 境中,当多个事务同时访问同一资源时,可能会造成并发问题,此时可以使用数据库系统的事务隔离级别来避免各类并发问题。此外,在应用程序中还可以使用悲观 锁和乐观锁来解决丢失更新的并发问题。?

数据库事务必须具备ACID的特征(Atomic原子性,Consistency一致性,Isolation隔离性,Durability持久性)?
??? 原子性,指整个数据库事务是不可分割的单元。只有所有的语句执行成功,才算成功。?
??? 一致性,指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。?
???? 隔离性,指在并发环境中,当不同的事务同时操作相同的数据时,每个事务都有各自的完整数据空间。?
???? 持久性,指的是只要事务成功结束,对数据库做的更新要永久保存下来.?

Transaction和Session的关系,应该注意以下几点?
????? Transaction的rollback()和Session的close()方法都会抛出HibernateException?
???? 不论事务是否成功,最后都应该关闭Session。?
????? 即使事务中只包含只读操作,也应该在事务成功执行之后提交事务,并且在事务执行失败时撤销事务,因为在提交或撤销事务时,数据库系统会释放占用的资源。?

多个事务同时运行时的并发问题?
???? 第一类丢失更新,撤销一个事务时,把其他事务已提交的更新数据覆盖了。?
???? 脏读,一个事务读到另一个事务未提交的更新数据。?
???? 虚读,一个事务读到另一个事务已提交的新插入的数据。?
???? 不可重复读,一个事务读到另一个事务已提交的更新数据。?
????? 第二类更新,一个事务覆盖另一事务已提交的更新数据。?

数据库系统锁的基本原理?

按照锁定的资源的粒度,锁可以分为以下类型?
?? 数据库级锁: 锁定整个数据库?
?? 表级锁: 锁定一张表?
?? 区域级锁: 锁定数据库的特定区域?
?? 页面级锁: 锁定数据库的特定页面?
?? 见面级锁: 锁定数据库的特定页面?
?? 键值级锁: 锁定数据库表中带有索引的一行数据。?
?? 行级锁: 锁定数据库表中的但行数据(即一条记录)?


按照封锁的程度,锁可以分为: 共享锁,独占锁,更新锁?

共享锁, 共享锁用于读数据操作,它是非独占的,允许其他事务同时读取其锁定的资源,但不允许其他事务更新数据。共享锁的特征:?
加锁条件:当一个事务执行Select操作时,数据库系统就会为其分配一把共享锁,来锁定查询数据。?
???? 解锁条件:在默认情况下,数据读取完毕,共享锁就解除了。?
???? 与其他锁的兼容性:如果数据资源上放置了共享锁,还能再放置共享锁和更新锁。?
???? 并发性能:具有良好的并发性能,当多个事务读相同的数据时,每个事务都会获得共享锁,因此可以同时读锁定的数据。?

独占锁,也叫排它锁,适用于修改数据的场合。它锁定的资源,其他事务不能读取也不能更新。独占锁具有以下特征:?
??? 加锁的条件:当一个事务执行insert、update、或delete语句时,数据库就会为SQL所操作的数据使用独占锁。如果数据上有其他锁,那么就能放置独占锁.
??? 解锁条件:到事务结束时才能被解除?
与其他锁的兼容性:独占锁不能和其他锁兼容。通用如果资源上有其他锁,那么也不能放置独占锁。?
??? 并发性能:性能较差,只允许有一个事务访问锁定的数据,如果其他事务也需要访问该数据,就必须等待,直到前一个事务结束,解除了独占锁,其他事务才有机会访问资源。?

更新锁,在更新操作的初始化阶段用来锁定可能要被修改的资源,这可以避免使用共享锁造成死锁的现象。更新具有以下特征:?
??? 加锁的条件:当一个事务执行update语句时,数据库系统会先为事务分配一把更新锁。?
??? 解锁条件:读取数据完毕,执行更新操作时,会把更新锁升级为独占锁。?
???? 与其他锁的兼容性:更新锁与共享锁是兼容的。也就是说,一个资源可以同时放置更新锁和共享锁,但是最多只能放置一把更新锁。?
??? 并发性能:允许多个事务同时访问资源。但不允许修改。?

死锁及其防止方法?