数据库事务和锁(三)

原创 2004年01月20日 21:21:00

使用事务的考虑

在使用事务时,原则上应该使事务尽可能得短并且要避免事务嵌套。事务应该尽可能得短,这是因为比较长的事务增加了事务占用数据的时间,使其它必须等待访问该事务锁定数据的事务,延长了等待访问数据的时间。在使用事务时,为了使事务尽可能得短,应该采取一些相应的方法。为了最小化时间,在使用一些Transact-SQL语句时,一定要非常小心。例如,当使用循环语句WHILE时,一定要事先确认循环的长度和占用的时间,使这种循环在完成相应的功能之前,一定要确保循环尽可能得短。在开始事务之前,一定要了解需要用户交互式操作才能得到的信息。这样,在事务的进行过程中,就可以避免进行一些耗费时间的交互式操作,缩短事务进程的时间。在一个用户定义的事务中,应该尽可能地使用一些数据操纵语言,例如INSERT、UPDATE和DELETE语句,因为这些语句主要是操纵数据库中的数据。而对于一些数据定义语言,应该尽可能地少用或者不用,因为这些数据定义语言的操作既占用比较长的时间,又占用比较多的资源,并且这些数据定义语言的操作通常不涉及到数据,所以应该在事务中尽可能地少用或者不用这些操作。另外,在使用数据操纵语言时,要注意,一定要在这些语句中使用条件判断语句,使得这些数据操纵语言涉及到尽可能少的记录,从而缩短事务的处理时间。

在嵌套事务时,也要注意一些问题。虽然说,在事务中间嵌套事务是可能的,并不影响SQL Server处理事务的性能。但是,实际上,使用嵌套事务,除了把事务搞得更加复杂之外,并没有这么明显的好处。因此,不建议使用嵌套事务。

事务的类型

根据系统的设置,可以把事务分成两种类型。一种是系统提供的事务,另一种是用户定义的事务。系统提供的事务是指在执行某些语句时,一条语句就是一个事务。这时要明确,一条语句的对象既可能是表中的一行数据,也可能是表中的多行数据,甚至是表中的全部数据。因此,只有一条语句构成的事务也可能包含了多行数据的处理。例如执行下面这条数据操纵语句:

UPDATE  authors

SET state = ‘CA’

这是一条语句,这条语句本身就构成了一个事务。这条语句由于没有使用条件限制,那么这条语句就是修改表中的全部数据。所以这个事务的对象,就是修改表中的全部数据。如果authors表中有1000行数据,那么这1000行数据的修改要么全部成功,要么全部失败。

另外一种事务,是用户明确定义的事务。在实际应用中,大多数的事务处理就是采用了用户定义的事务来处理。在开发应用程序时,可以使用BEGIN TRANSACTION语句来定义明确的用户定义的事务。在使用用户定义的事务时,一定要注意两点:一是事务必须有明确的结束语句来结束。如果不使用明确的结束语句来结束,那么系统可能把从事务开始到用户关闭连接之间的全部操作都作为一个事务来对待。事务的明确结束可以使用这样两个语句中的一个:COMMIT语句和ROLLBACK语句。COMMIT语句是提交语句,将全部完成的语句明确地提交到数据库中。ROLLBACK语句是取消语句,该语句将事务的操作全部取消,即表示事务操作失败。

还有一种特殊的用户定义的事务,这就是分布式事务。前面提到的事务都是在一个服务器上的操作,其保证的数据完整性和一致性是指一个服务器上的完整性和一致性。但是,如果一个比较复杂的环境,可能有多台服务器,那么要保证在多服务器环境中事务的完整性和一致性,就必须定义一个分布式事务。在这个分布式事务中,所有的操作都可以涉及对多个服务器的操作,当这些操作都成功时,那么所有这些操作都提交到相应服务器的数据库中,如果这些操作中有一条操作失败,那么这个分布式事务中的全部操作都被取消。

锁和锁的作用

锁就是防止其他事务访问指定的资源的手段。锁是实现并发控制的主要方法,是多个用户能够同时操纵同一个数据库中的数据而不发生数据不一致现象的重要保障。一般来说,锁可以防止脏读、不可重复读和幻觉读。脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是脏数据,依据脏数据所做的操作可能是不正确的。不可重复读是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。幻觉读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。

数据库事务与锁详解

什么是事务(Transaction)?是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源...
  • aluomaidi
  • aluomaidi
  • 2016年09月07日 16:31
  • 2940

数据库并发访问、事务与锁的关系

Normal 0 7.8 磅 0 2 false false false Microsof...
  • liyangbing315
  • liyangbing315
  • 2009年10月13日 16:14
  • 5656

正确理解Spring事务和数据库事务和锁

Lock wait timeout exceeded; try restarting transaction解决方案
  • codingtu
  • codingtu
  • 2017年09月20日 21:59
  • 46608

数据库中的锁与事务

引言什么事事务?事务是一组原子性的SQL语句,这组语句要么全部成功,要么发生失败时全部不执行。一个良好的支持事务数据库系统必须支持如下4个特性: 原子性(atomicity) 一致性(consiste...
  • kailee_hust
  • kailee_hust
  • 2016年06月28日 16:24
  • 1036

数据库事务隔离级别和锁的实现方式

当数据库中多个事务(Transaction)处理同一数据时,就会出现并发的问题,也就是需要解决数据库隔离性的问题(isolation)。     数据库的事务操作主要会碰到以下几类问题:     ...
  • yangtianyu1218
  • yangtianyu1218
  • 2016年05月31日 10:20
  • 1400

MySql事务隔离级别锁机制实际案例深入分析

很多情况下,我们可能并没有过多的关注事务隔离级别和锁机制,可能在部分人看来,这些是晦涩难懂的冷门知识。本文通过分析一个简短的DEMO演示各种事务隔离级别下、各种锁定情况下并发执行时对数据更新差异,你将...
  • cpaqyx
  • cpaqyx
  • 2014年11月30日 19:44
  • 977

数据库事务特性、并发、隔离级别、锁种类、锁粒度

本文解释数据库并发控制事务 对数据库数据执行的一系列操作,可以是一条或者多条SQL语句 数据库事务特性1、 原子性 对数据库数据的一系列操作,要么全部执行,要么都不 执行 2、 一致性 数...
  • lo11ve
  • lo11ve
  • 2017年11月26日 13:21
  • 97

事务、数据库事务、事务隔离级别、锁的简单总结

一、数据库事务 1、事务是作为单个逻辑工作单元执行的一系列操作。可以是一条SQL语句也可以是多条SQL语句。 2、事务具有四个特性  原子性(Atomicity):事务中的全部操作在数据库中是不可分...
  • zootial
  • zootial
  • 2014年12月25日 14:21
  • 3771

MySQL之事务、索引、锁

Mysql之事务、锁、索引 事务 锁 索引 事务概念
  • u014568443
  • u014568443
  • 2016年05月20日 17:24
  • 1029

Mysql数据库事务的隔离级别和锁的实现原理分析

mysql Innodb 解决各个不同事物隔离级别所产生问题的方法。
  • tangkund3218
  • tangkund3218
  • 2015年08月16日 18:32
  • 7331
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据库事务和锁(三)
举报原因:
原因补充:

(最多只允许输入30个字)