事务

来源:互联网 发布:淘宝导航图片怎么放 编辑:程序博客网 时间:2024/05/17 17:15

事务的特性
原子性
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

隔离性
隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其它用户的事务所干扰,多个并发事务之间数据要相互隔离。

一致性
一致性是指事务前后数据的完整性必须保持一致。

持久性
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。

事务并发产生的问题
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
这些问题可归纳为以下几类。
丢失更新(Lost Update)

脏读(Dirty Read)
一个事务读到了另一个事务未提交的更新数据。

幻读(虚读)
在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。

不可重复读(Non-Repeatable Read)
一个事务读到了另一个事务已提交的更新数据。

事务的隔离级别



隔离级别与并发性能的关系

设置隔离隔离级别的原则
  • 隔离级别越高,越能保证数据的完整性和一致性,但是对性能的影响也越大。
  • 对于多数的应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed。它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题。在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

在mysql.exe中设置隔离级别
  • 每启动一个mysql.exe程序,就会获得一个单独的数据库连接。每个数据库连接都会有个全局变量@@tx_isolation,表示当前的事务隔离级别。MySQL默认的隔离级别为可重复读(Reapeatable Read)。查看当前的隔离界别,使用的命令如下:
  • 如果要把当前mysql.exe程序的隔离级别改为Read Committed,可使用如下SQL命令:


锁机制
锁技术是实现并发控制的一个非常重要的技术。就是在事务在对某个数据对象例如表、记录等操作之前,先想系统发出请求,对其进行加锁。加锁后,事务就对数据库对象有了一定的控制。在释放锁之前,其它事务不能更新此数据对象。

锁的类型
确切的控制由封锁的类型决定的。基本的锁类型有两种:排它锁(Exclusive Locks,简称X锁)和共享锁(Share Locks,简称S锁)
排它锁(写锁)
排它锁,又称为写锁。若事务T对数据对象A加上了排它锁,则只允许事务T读取和修改A,其它任何事务都不能再对A加任何类型的锁(理解为 独占行为),直到T释放A上的锁。这就保证了其它事务在T释放A上的锁之前不能再读取和修改A。
共享锁(读锁)
共享锁,又称为读锁。若事务T对数据对象A加上了共享锁,则事务T可以读A但不能修改A,其它事务只能再对A加共享锁,但不能加排它锁,知道T释放A上的锁。这就保证了其它事务可以读A,但在T释放A上的锁之前不能对A做任何的修改。

活锁和死锁
活锁

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。T3也请求封锁R,但T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放锁后系统首先批准T4的请求。如果持续下去的话,T2有可能永远等待,这就是活锁的情形。
避免活锁的简单方法就是采用先来先服务的策略。
死锁
如果事务T1封锁了数据R1,T2封锁了数据R2。然后T1又请求封锁R2,则T1只好等待。接着T2又请求封锁R1,则T2也只好等待。这样就出现了T1等待T2释放锁,T2又等待T1释放锁,两个事务永远都不能结束,就形成了死锁。
数据库中解决死锁的方法分为两种:
①采取一定措施来预防死锁的发生
②允许死锁的发生,发生死锁后采取一定手段解除死锁。
更深入的研究请参考《数据库系统概论》第4版-萨师煊
0 0
原创粉丝点击