事务的概念

事务( transacton)是构成单一逻辑工作单元的操作集合,它是一个SQL语句序列,通常,每个 INSERT

UPDATE、 DELETE命令被作为一个事务处理,事务开始之后,所有的操作都陆续写到事务日志中,因此事务处理确保了数据的一致性和可恢复性

当进行事务操作时,系统自动生成一个检查点机制,检査点周期地楹査事务日志,如果在事务日志中事务全部完成,那么检査点将事务日志中的该事务提交到数据库中,并且在事务日志中做一个检查点提交标记。如果没有完成,那么检査点不将事务日志中的该事务提交到数据库中,并且在事务日志中做一个检查点未提交标记。

 

事务的基本属性

事务具有下列基本属性(ACD):

原子性( Atomicity):事务是一个不可分割的工作单元。

一致性( Consistency):即数据不会因事务的执行而遭受破环

独立性( Isolation):在并发处理过程中,事务的先后单独执行结果不随多个事务并发执行的情况而改变

持久性( Durability):-个事务操作完成后对数据库的所有更新水久地保存在数据库中。

 

事务的分类

根据系统的设置,可以把事务分成两种类型。一种是系统提供的事务,另一种是用户定义的事务。系统提供的事务是指在执行某些语句时,一条语句就是一个事务。

 

事物的并发控制产生的问题

1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。
 e.g.
        1.Mary的原工资为1000, 财务人员将Mary的工资改为了8000(但未提交事务)
        2.Mary读取自己的工资 ,发现自己的工资变为了8000,欢天喜地!
        3.而财务发现操作有误,回滚了事务,Mary的工资又变为了1000
          像这样,Mary记取的工资数8000是一个脏数据。

 

2. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
    e.g.
    1.在事务1中,Mary 读取了自己的工资为1000,操作并没有完成
    2.在事务2中,这时财务人员修改了Mary的工资为2000,并提交了事务.
    3.在事务1中,Mary 再次读取自己的工资时,工资变为了2000

 解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题。

 

3. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
   e.g. 
   目前工资为1000的员工有10人。
   1.事务1,读取所有工资为1000的员工。
   2.这时事务2向employee表插入了一条员工记录,工资也为1000
   3.事务1再次读取所有工资为1000的员工 共读取到了11条记录, 

 

事务的四种隔离级别

事务和锁

 

 

SQLSERVER和ORACLE 事务比较 

事务和锁

 

锁的分类

种是读操作要求的共享锁,另一种是写操作要求的排他锁。

按对资源的占用方式来分,锁分两种

1.读操作要求的共享锁

共享锁定会防止独占锁定,但允许其他的共享锁定。

2.写操作要求的排他锁

独占锁定既防止其他的独占锁定,也防止其他的共字锁定。为了更改数据,数据库必须在进行更改的行上实加行独占锁定, INSERT、 UPDATE、 DELETE和SELECT FOR UPDATE语句都会隐式采用必要的行锁定。 SQL Server中还有更新锁,它是为了防止死锁而设定的

按锁定的对象来分

有表锁、行锁、数据库锁等,表锁定是对整个表进行锁定,行锁定是对表中特定行进行锁定,数据库锁是锁定整个数据库。

 

 

 

 

 

相关文章: