好久没找工作了……孤注一掷注定失败
事务和锁
事务和锁是数据库中联系紧密的两个概念,用于保证数据的一致性。
什么是事务?
事务在数据库中主要用于保证数据的一致性,防止出现错误数据。在事务内的语句都会被看成一个单元,一旦有一个失败,那么所有的都会失败。
事务就是一组包含一条或者多条语句的逻辑单元,每个事务都是一个原子单位,在事务中的语句被看作为一个整体,要么一起提交,作用在数据库上,使数据库数据永久的修改;要么一起被撤销,对数据库不做任何修改。
事务的特性
事务有以下四个特性(ACID):
ü 原子性:指事务全有或全无的性质,也就是说,事务应作为一个工作单元,事务处理完后,所有的工作要么全在数据库中保存下来,要么全部回滚,全部不保留。
ü 一致性:保证事务执行前后数据库必须处于一致的状态。
ü 隔离性:多个事务同时进行时,它们之间应该相互不干扰。事务过程中暂时不一致的数据不能被其他事务应用,直到数据一致。
ü 永久性:事务一旦提交,那么这将是对数据永久的修改。
开始事务
SQL Server中有3中开始事务的方式:隐式事务、显示开始、自动提交,缺省为自动提交。
ü 自动提交:对于用户发出的每条SQL语句,SQL都会自动开始一个事务,并且在执行后自通进行提交操作来完成这个事务。在这种模式下,一个SQL语句就是一个事务。
ü 显示开始:以BEGIN TRANSACTION命令开始一个事务。
ü 隐式开始:任何DML语句(delete、update、insert)都会开启一个事务,而事务以commit或rollback结束。
Oracle数据库和SQL Server有所不同。Oracle数据库不用显示的设置事务的开始,任何一条DML语句都会开始一个事务,直到用户发出commit或rollback操作,这个事务才结束。当执行到下一条DDL语句时,即使用户没有发出commit或rollback语句,Oracle也会提交当前事务。
事务的保存点
在事务中可以根据自己的需要设置保存点。保存点可以设置在事务中的任何地方,这样就可以把较长的事务分成较小的段,这样做的好处是当数据库出现问题是可以不用全部回滚,只需要回滚到保存点即可。
ü 事务只回滚保存点之后的操作;
ü 回滚到某保存点后,它以后的保存点将被删除,但保存点会保留;
ü 保存点之后的锁将被释放,只之前的会被保留。
认识锁
锁出现在数据共享的环境中,它是一种机制,在访问相同资源时,可以防止事务之间的破坏性交互。例如,在多个会话同时操作某表是,优先操作的会话需要对其锁定。
排他锁:也叫写锁,这种模式防止资源的共享,用做修改数据。如果有事务T给数据A加上该锁,那么其他事务不能对A加任何锁,所以只允许T对该数据进行读取和修改,直到事务完成该类型的锁的释放为止。
共享锁:也叫读锁,该模式锁下的数据只允许读取,不允许修改。如果有事务T给数据A加上共享锁,其他事务不能对A加排他锁,只能加共享锁。加了该锁的数据可以并发的读取数据。
在执行DML操作时,数据库会先申请共享锁,防止其他会话对其进行DDL操作,一旦申请成功,则会话申请排他锁,如果此时其他会话正在修改其记录,那么等待其事务结束后再为修改的记录加上排他锁。