您的位置:首页 > 数据库

数据库事务及锁机制介绍

2016-01-13 19:00 246 查看
事务介绍

因为一直使用Spring这种声明式的事务管理,一直以为事务的主要作用是对一个业务方法中多次执行数据库操作的最终提交。近期重新了解了下事务,有了新的认识。数据库事务除了有异常回滚的功能,更重要的是控制数据表的共享数据。

首先数据库事务需要满足四个特性ACID,原子性、一致性、隔离性、持久性。数据一致性是最终目标,其他特性都是为达到该目的的措施。

和Java程序采用对象锁机制进行线程同步类似,数据库管理系统采用数据库锁机制保证事务的隔离性。当多个事务试图对相同的数据进行操作时,只有持有锁的事务才能操作数据。

通常数据并发会造成3类数据读问题(脏读,不可重复读,幻想读)以及2类数据更新问题(第一类丢失更新和第二类丢失更新)

1、脏读(dirty read):A事务读取B事务尚未提交的更改数据,并在这个数据的基础上操作。如果恰巧B事务回滚,那么A事务读到的数据根本是不被承认的。



在这个场景中,B希望取款500元而后又撤销了动作,而A往相同的账户中转了100元,因为A读了B未提交的事务,并且最后修改了金额,造成账户白白丢失了500元。在oracle中使用数据版本机制,不会发生脏读的情况。

2、不可重复读(unrepeatable read):A事务读取了B事务已经提交的更改数据。即A事务读取多次数据,但是读取的过程中,B事务可能修改了金额,造成A事务每次读取的数据可能不一致。

3、幻象读(phantom read):A事务读取B事务提交的新增数据,这时A事务将出现幻想读的问题。假设银行系统在同一个事务中,两次统计存款账户的总金额,在两次统计的过程中,刚好新增了一个账户,并存款100元,这时两次统计的总金额不一致。



幻象读和不可重复读的区别是,幻象读是发生在新增数据的时候,不可重复读发生在修改数据的时候。两种情况采取的对策不一样,不可重复读只要对操作的数据添加行级锁,阻止操作中的数据发生变化,而幻象读,要防止新增数据,往往需要添加表级锁,将整个表锁定,防止新增数据(oracle使用多版本的数据方式实现)。

4、第一类丢失更新:A事务撤销时,把已经提交的B事务的更新数据覆盖了。这种错误很严重,如下



5、第二类丢失更新:A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失。



这种情况银行会有损失,感觉还是蛮好的。

数据库锁机制

数据库的锁按锁定的对象不同,可以分为表锁定和行锁定。按并发事务锁定的关系,可以分为共享锁定和独占锁定。共享锁定会防止独占锁定,但允许其他的共享锁定。独占锁定既防止其他的独占锁定,也防止其他的共享锁定。为了更改数据,数据库必须在进行更改的行上施加行独占锁定,insert、update、delete、select for update语句都会隐士采用必要的行锁定。

如下是oracle常用的5中锁定

1、行共享锁定:一般通过select for update 语句隐式获得。行共享锁定并不防止对数据行进行更改的操作,但是可以防止其他会话获取独占性数据表锁定。允许进行多个并发的行共享和行独占性锁定,还允许进行数据表的共享或者采用共享行独占锁定。

2、行独占锁定:通过一条insert、update、delete语句隐士获取,或者通过一条LOCK TABLE ROW EXCLUSIVE MODE语句显示获取。这个锁可以防止其他会话获取一个共享锁定,共享行独占锁定或独占锁定。

3、表共享锁定:通过LOCK TABLE IN SHARE MODE语句显示获得,这种锁定可以防止其他会话获取行独占锁定(insert,update,delete),或者防止其他表共享行独占锁定或表独占锁定,它允许在表中拥有多个行共享和表共享锁定,该锁定可以让会话具有对表事务级一致性访问,因为其他会话在用户提交或者回溯该事务并释放对该表的锁定之前不能更改这个被锁定的表。

4、表共享行独占锁定:通过 LOCK TABLE IN SHARE ROW EXCLUSIVE MODE语句显示获得。这种锁定可以防止其他会话获取一个表共享、行独占或者表独占锁定,它允许其他行共享锁定,它允许其他行共享锁定。这种锁定类似于表共享锁定,只是一次只能对一个表放置一个表共享行独占锁定。如果A会话拥有该锁定,则B会话可以执行select for update操作,但如果B会话试图更新选择的行,则需要等待。

5、表独占:通过LOCK TABLE IN EXCLUSIVE MODE显示获得。这个锁定防止其他会话对该表的任何锁定。

事务隔离级别

因为直接使用数据的锁比较麻烦,用户可以设置事务的隔离级别来实现自动锁机制。通过设置事务的隔离级别,数据库就会分析事务中的SQL语句,然后自动为事务操作的数据资源加上适合的锁。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: