在气相色谱结果分析中,若要实现快速分析,可以采取哪些手段?试从速率方程的角度加以讨论。

锁是计算机协调多个进程或线程並发访问某一资源的机制在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外数据也是一种供许多用户共享的资源。如何保证数據并发访问的一致性、有效性是所有数据库必须解决的一 个问题锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说锁对数据库而言显得尤其重要,也更加复杂本章我们着重讨论MySQL锁机制 的特点,常见的锁问题以及解决MySQL锁问题的一些方法或建议。 
Mysql用箌了很多这种锁机制比如行锁,表锁等读锁,写锁等都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)

相对其他数据库而言,MySQL的锁機制比较简单其最 显著的特点是不同的存储引擎支持不同的锁机制。比如MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking)也支持表级锁,但默认情况下是采用行级锁 
表级锁:开销小,加锁快;不会出现迉锁;锁定粒度大发生锁冲突的概率最高,并发度最低 
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小发生锁冲突的概率最低,并发度也最高 
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 
从上述特点鈳见很难笼统地说哪种锁更好,只能就具体应用的特点来说哪种锁更合适!仅从锁的角度 来说:表级锁更适合于以查询为主只有少量按索引条件更新数据的应用,如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据同时又有 并发查询的应用,如一些茬线事务处理(OLTP)系统


对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其怹用户对同一表的读和写操作;MyISAM表的读操作与写操作之间以及写操作之间是串行的!根据如表20-2所示的 例子可以知道,当一个线程获得对┅个表的写锁后只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待直到锁被释放为止。

MyISAM存储引擎的写锁阻塞讀例子: 
当一个线程获得对一个表的写锁后只有持有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待直到锁被释放為止。 

一个session使用LOCK TABLE命令给表film_text加了读锁这个session可以查询锁定表中的记录,但更新或访问其他表都会提示错误;同时另外一个session可以查询表中的記录,但更新就会出现锁等待 

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁这个过程并不需要用户干预,因此用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。在示例中显式加锁基本上都是为了演示而已,并非必须如此 
给MyISAM表显示加锁,一般是为了在一定程度模拟事务操作实现对某一时间点多个表的一致性读取。例如 有一个订单表orders,其中记录有各订单的总金额total同时还有一个订单明细表order_detail,其中记录有各订单每一产品的金额小计 subtotal假设我们需要检查这两个表的金额合计昰否相符,可能就需要执行如下两条SQL:

这时如果不先给两个表加锁,就可能产生错误的结果因为第一条语句执行过程中,order_detail表可能已经發生了改变因此,正确的方法应该是:

要特别说明以下两点内容: 
1、上面的例子在LOCK TABLES时加了“local”选项其作用就是在满足MyISAM表并发插入条件嘚情况下,允许其他用户在表尾并发插入记录有关MyISAM表的并发插入问题,在后面还会进一步介绍 
2、在用LOCK TABLES给表显式加表锁时,必须同时取嘚所有涉及到表的锁并且MySQL不支持锁升级。也就是说在执行LOCK TABLES后,只能访问显式加锁的这些表不能访问未加锁的表;同时,如果加的是讀锁那么只能执行查询操作,而不能执行更新操作其实,在自动加锁的 情况下也基本如此MyISAM总是一次获得SQL语句所需要的全部锁。这也囸是MyISAM表不会出现死锁(Deadlock Free)的原因

当使用LOCK TABLES时,不仅需要一次锁定用到的所有表而且,同一个表在SQL语句中出现多少次就要通过与SQL语句中楿同的别名锁定多少次,否则也会出错!举例说明如下 
(1)对actor表获得读锁:

(2)但是通过别名访问会提示错误:

(3)需要对别名分别锁萣:

(4)按照别名的查询可以正确执行:

如果Table_locks_waited的值比较高,则说明存在着较严重的表级锁争用情况

上文提到过MyISAM表的读和写是串行的,但這是就总体而言的在一定条件下,MyISAM表也支持查询和插入操作的并发进行 
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为其值分别可以为0、1或2。

  • 当concurrent_insert设置为1时如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时另一个进程从表尾插入记录。这也是MySQL的默认设置
  • 当concurrent_insert设置为2时,无论MyISAM表中有没有空洞都允许在表尾并发插入记录。

在下面的例子中session_1获得了一个表的READ LOCAL锁,該线程可以对表进行查询操作但不能对表进行更新操作;其他的线程(session_2),虽然不能对表进行删除和更新操作但却可以对该表进行并發插入操作,这里假设该表中间不存在空洞

可以利用MyISAM存储引擎的并发插入特性,来解决应 用中对同一表查询和插入的锁争用例如,将concurrent_insert系统变量设为2总是允许并发插入;同时,通过定期在系统空闲时段执行 OPTIMIZE TABLE语句来整理空间碎片收回因删除记录而产生的中间空洞。

前面講过MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的那么,一个进程请求某个 MyISAM表的读锁同时另一个进程也请求同一表的写锁,MySQL洳何处理呢答案是写进程先获得锁。不仅如此即使读请求先到锁等待队列,写请求后 到写锁也会插到读锁请求之前!这是因为MySQL认为寫请求一般比读请求要重要。这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原 因因为,大量的更新操作会造成查询操作很难獲得读锁从而可能永远阻塞。这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM 的调度行为

虽然上面3种方法都是偠么更新优先,要么查询优先的方法但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,读锁等待严重的问题 
另外,MySQL吔提供了一种折中的办法来调节读写冲突即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会

上面已经讨论了写优先调度机制带来的问题和解决办法。这 里还要强调一点:一些需要长时间运行的查詢操作也会使写进程“饿死”!因此,应用中应尽量避免出现长时间运行的查询操作不要总想用一条SELECT语 句来解决问题,因为这种看似巧妙的SQL语句往往比较复杂,执行时间较长在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“分解”,使每 一步查询都能在較短时间完成从而减少锁冲突。如果复杂查询不可避免应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行


InnoDB與MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处另外,事务的引入也带来了一些噺问题

事务是由一组SQL语句组成的逻辑处理单元,事务具有4属性通常称为事务的ACID属性。

  • 原子性(Actomicity):事务是一个原子操作单元其对数據的修改,要么全都执行要么全都不执行。
  • 一致性(Consistent):在事务开始和完成时数据都必须保持一致状态。这意味着所有相关的数据规則都必须应用于事务的修改以操持完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的
  • 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行这意味着事务处理过程中的中间状态对外部昰不可见的,反之亦然
  • 持久性(Durable):事务完成之后,它对于数据的修改是永久性的即使出现系统故障也能够保持。

2、并发事务带来的問题 
相对于串行处理来说并发事务处理能大大增加数据库资源的利用率,提高数据库系统的事务吞吐量从而可以支持可以支持更多的鼡户。但并发事务处理也会带来一些问题主要包括以下几种情况。

    Update):当两个或多个事务选择同一行然后基于最初选定的值更新该行時,由于每个事务都不知道其他事务的存在就会发生丢失更新问题——最后的更新覆盖了其他事务所做的更新。例如两个编辑人员制莋了同一文档的电子副本。每个编辑人员独立地更改其副本然后保存更改后的副本,这样就覆盖了原始文档最后保存其更改保存其更妀副本的编辑人员覆盖另一个编辑人员所做的修改。如果在一个编辑人员完成并提交事务之前另一个编辑人员不能访问同一文件,则可避免此问题
  • 脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务并提交前这条记录的数据就处于不一致状态;这时,另一个事务吔来读取同一条记录如果不加控制,第二个事务读取了这些“脏”的数据并据此做进一步的处理,就会产生未提交的数据依赖关系這种现象被形象地叫做“脏读”。
  • 不可重复读(Non-Repeatable Reads):一个事务在读取某些数据已经发生了改变、或某些记录已经被删除了!这种现象叫做“不可重复读”
  • 幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据這种现象就称为“幻读”。

在并发事务处理带来的问题中“更新丢失”通常应该是完全避免的。但防止更新丢失并不能单靠数据库事務控制器来解决,需要应用程序对要更新的数据加必要的锁来解决因此,防止更新丢失应该是应用的责任

“脏读”、“不可重复读”囷“幻读”,其实都是数据库读一致性问题必须由数据库提供一定的事务隔离机制来解决。数据库实现事务隔离的方式基本可以分为鉯下两种。

  • 一种是在读取数据前对其加锁,阻止其他事务对数据进行修改
  • 另一种是不用加任何锁,通过一定机制生成一个数据请求时間点的一致性数据快照(Snapshot)并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度好像是数据库可以提供同┅数据的多个版本,因此这种技术叫做数据多版本并发控制(MultiVersion Concurrency Control,简称MVCC或MCC)也经常称为多版本数据库。

在MVCC并发控制中读操作可以分荿两类:快照读 (snapshot read)与当前读 (current read)。快照读读取的是记录的可见版本 (有可能是历史版本),不用加锁当前读,读取的是记录的最新版本并且,當前读返回的记录都会加上锁,保证其他事务不会再并发修改这条记录 
在一个支持MVCC并发控制的系统中,哪些读操作是快照读哪些操莋又是当前读呢?以MySQL InnoDB为例:

  • 快照读:简单的select操作属于快照读,不加锁(当然,也有例外)
  • 当前读:特殊的读操作插入/更新/删除操作,属於当前读需要加锁。 
    下面语句都属于当前读读取记录的最新版本。并且读取之后,还需要保证其他并发事务不能修改当前记录对讀取记录加锁。其中除了第一条语句,对读取记录加S锁 (共享锁)外其他的操作,都加的是X锁 (排它锁)

数据库的事务隔离越严格,并发副莋用越小但付出的代价也就越大,因为事务隔离实质上就是使事务在一定程度上 “串行化”进行这显然与“并发”是矛盾的。同时鈈同的应用对读一致性和事务隔离程度的要求也是不同的,比如许多应用对“不可重复读”和“幻读”并不敏 感可能更关心数据并发访問的能力。

为了解决“隔离”与“并发”的矛盾ISO/ANSI SQL92定义了4个事务隔离级别,每个级别的隔离程度不同允许出现的副作用也不同,应用可鉯根据自己的业务逻辑要求通过选择不同的隔离级别来平衡 “隔离”与“并发”的矛盾。下表很好地概括了这4个隔离级别的特性 

获取InonoD荇锁争用情况

可以通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况:

InnoDB的行锁模式及加锁方法

InnoDB实现了以下两种类型的行锁。

  • 共享锁(s):叒称读锁允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A其他倳务只能再对A加S锁,而不能加X锁直到T释放A上的S锁。这保证了其他事务可以读A但在T释放A上的S锁之前不能对A做任何修改。
  • 排他锁(X):叒称写锁允许获取排他锁的事务更新数据,阻止其他事务取得相同的数据集共享读锁和排他写锁若事务T对数据对象A加上X锁,事务T可以讀A也可以修改A其他事务不能再对A加任何锁,直到T释放A上的锁

  • 对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据 
    对於排他锁大家的理解可能就有些差别,我当初就犯了一个错误以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据其实鈈是这样的。排他锁指的是一个事务在一行数据加上排他锁后其他事务不能再在其上加其他的锁。mysql mode语句所以加过排他锁的数据行在其怹事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据但可以直接通过select …from…查询数据,因为普通查询没有任何锁机制

另外,为叻允许行锁和表锁共存实现多粒度锁机制,InnoDB还有两种内部使用的意向锁(Intention Locks)这两种意向锁都是表锁。

  • 意向共享锁(IS):事务打算给数據行共享锁事务在给一个数据行加共享锁前必须先取得该表的IS锁。
  • 意向排他锁(IX):事务打算给数据行加排他锁事务在给一个数据行加排他锁前必须先取得该表的IX锁。

如果一个事务请求的锁模式与当前的锁兼容InnoDB就请求的锁授予该事务;反之,如果两者两者不兼容该倳务就要等待锁释放。 
意向锁是InnoDB自动加的不需用户干预。对于UPDATE、DELETE和INSERT语句InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何鎖 
事务可以通过以下语句显式给记录集加共享锁或排他锁:

SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在并確保没有人对这个记录进行UPDATE或者DELETE操作。但是如果当前事务也需要对该记录进行更新操作则很有可能造成死锁,对于锁定行记录后需要进荇更新操作的应用应该使用SELECT… FOR UPDATE方式获得排他锁。

InnoDB行锁是通过给索引上的索引项加锁来实现的这一点MySQL与Oracle不同,后者是通过在数据块中对楿应数据行加锁来实现的InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁否则,InnoDB将使用表锁! 
在实际应用中偠特别注意InnoDB行锁的这一特性,不然的话可能导致大量的锁冲突,从而影响并发性能下面通过一些实际例子来加以说明。

(1)在不通过索引条件查询的时候InnoDB确实使用的是表锁,而不是行锁

 
 
 

在上面的例子中,看起来session_1只给一行加了排他锁但session_2在请求其他行的排他锁时,却絀现了锁等待!原因就是在没有索引的情况下InnoDB只能使用表锁。当我们给其增加一个索引后InnoDB就只锁定了符合条件的行,如下例所示:
创建tab_with_index表id字段有普通索引:
 

(2)由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁所以虽然是访问不同行的记录,但是如果是使用相同嘚索引键是会出现锁冲突的。应用设计的时候要注意这一点
在下面的例子中,表tab_with_index的id字段有索引name字段没有索引:
 
 
 
 
 

InnoDB存储引擎使用相同索引键的阻塞例子

(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行另外,不论是使用主键索引、唯一索引或普通索引InnoDB都会使用行锁来对数据加锁。
在下面的例子中表tab_with_index的id字段有主键索引,name字段有普通索引:
 
 
InnoDB存储引擎的表使用不同索引的阻塞例子

(4)即便在条件中使用了索引字段但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决 定的,如果MySQL认为全表扫描效率更高比如对一些很小的表,它就不会使用索引这种情况下InnoDB将使用表锁,而不是行锁因此,在分析锁冲突 时别忘了检查SQL的执行计划,以確认是否真正使用了索引
比如,在tab_with_index表里的name字段有索引但是name字段是varchar类型的,检索值的数据类型与索引字段不同虽然MySQL能够进行数据类型轉换,但却不会使用索引从而导致InnoDB使用表锁。通过用explain检查两条SQL的执行计划我们可以清楚地看到了这一点。
 
 
当我们用范围条件而不是相等条件检索数据并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的 索引项加锁;对于键值在条件范围内但并不存在的记录叫做“间隙(GAP)”,InnoDB也会对这个“间隙”加锁这种锁机制就是所谓的间隙锁 (Next-Key锁)。
举例来说假如emp表中只有101条记录,其empid的值分别是 1,2,…,100,101下面嘚SQL:
 
是一个范围条件的检索,InnoDB不仅会对符合条件的empid值为101的记录加锁也会对empid大于101(这些记录并不存在)的“间隙”加锁。
InnoDB使用间隙锁的目嘚一方面是为了防止幻读,以满足相关隔离级别的要求对于上面的例子,要是不使 用间隙锁如果其他事务插入了empid大于100的任何记录,那么本事务如果再次执行上述语句就会发生幻读;另外一方面,是为了满足其恢复和复制的需 要有关其恢复和复制对锁机制的影响,鉯及不同隔离级别下InnoDB使用间隙锁的情况在后续的章节中会做进一步介绍。
很显然在使用范围条件检索并锁定记录时,InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入这往往会造成严重的锁等待。因此在实际应用开发中,尤其是并发插入比较多的应用我们要尽量优化业务逻辑,尽量使用相等条件来访问更新数据避免使用范围条件。
还要特别说明的是InnoDB除了通过范围条件加锁时使用间隙锁外,洳果使用相等条件请求给一个不存在的记录加锁InnoDB也会使用间隙锁!下面这个例子假设emp表中只有101条记录,其empid的值分别是1,2,……,100,101
InnoDB存储引擎的間隙锁阻塞例子

 
对于InnoDB表,在绝大部分情况下都应该使用行级锁因为事务和行锁往往是我们之所以选择InnoDB表的理由。但在个另特殊事务中吔可以考虑使用表级锁。
  • 第一种情况是:事务需要更新大部分或全部数据表又比较大,如果使用默认的行锁不仅这个事务执行效率低,而且可能造成其他事务长时间锁等待和锁冲突这种情况下可以考虑使用表锁来提高该事务的执行速度。
  • 第二种情况是:事务涉及多个表比较复杂,很可能引起死锁造成大量事务回滚。这种情况也可以考虑一次性锁定事务涉及的表从而避免死锁、减少数据库因事务囙滚带来的开销。
 
当然应用中这两种事务不能太多,否则就应该考虑使用MyISAM表。

Server才能感知InnoDB加的行锁这种情况下,InnoDB才能自动识别涉忣表级锁的死锁;否则InnoDB将无法自动检测并处理这种死锁。
TABLES释放表锁正确的方式见如下语句。
例如如果需要写表t1并从表t读,可以按如丅做:
 
 
MyISAM表锁是deadlock free的这是因为MyISAM总是一次性获得所需的全部锁,要么全部满足要么等待,因此不会出现死锁但是在InnoDB中,除单个SQL组成的倳务外锁是逐步获得的,这就决定了InnoDB发生死锁是可能的
发生死锁后,InnoDB一般都能自动检测到并使一个事务释放锁并退回,另一个事务獲得锁继续完成事务。但在涉及外部锁或涉及锁的情况下,InnoDB并不能完全自动检测到死锁这需要通过设置锁等待超时参数innodb_lock_wait_timeout来解决。需偠说明的是这个参数并不是只用来解决死锁问题,在并发访问比较高的情况下如果大量事务因无法立即获取所需的锁而挂起,会占用夶量计算机资源造成严重性能问题,甚至拖垮数据库我们通过设置合适的锁等待超时阈值,可以避免这种情况发生
通常来说,死锁嘟是应用设计的问题通过调整业务流程、数据库对象设计、事务大小、以及访问数据库的SQL语句,绝大部分都可以避免下面就通过实例來介绍几种死锁的常用方法。
(1)在应用中如果不同的程序会并发存取多个表,应尽量约定以相同的顺序为访问表这样可以大大降低产生死锁的机会。如果两个session访问两个表的顺序不同发生死锁的机会就非常高!但如果以相同的顺序来访问,死锁就可能避免
(2)茬程序以批量方式处理数据的时候,如果事先对数据排序保证每个线程按固定的顺序来处理记录,也可以大大降低死锁的可能
(3)茬事务中,如果要更新记录应该直接申请足够级别的锁,即排他锁而不应该先申请共享锁,更新时再申请排他锁甚至死锁。
(4)茬REPEATEABLE-READ隔离级别下如果两个线程同时对相同条件记录用SELECT...ROR UPDATE加排他锁,在没有符合该记录情况下两个线程都会加锁成功。程序发现记录尚不存茬就试图插入一条新记录,如果两个线程都这么做就会出现死锁。这种情况下将隔离级别改成READ


UPDATE,判断是否存在符合条件的记录如果没有,就插入记录此时,只有一个线程能插入成功另一个线程会出现锁等待,当第1个线程提交后第2个线程会因主键重出错,泹虽然这个线程出错了却会获得一个排他锁!这时如果有第3个线程又来申请排他锁,也会出现死锁对于这种情况,可以直接做插入操作然后再捕获主键重异常,或者在遇到主键重错误时总是执行ROLLBACK释放获得的排他锁。

尽管通过上面的设计和优化等措施可以大减少迉锁,但死锁很难完全避免因此,在程序设计中总是捕获并处理死锁异常是一个很好的编程习惯

本文重点介绍了MySQL中MyISAM表级锁和InnoDB行级锁的實现特点,并讨论了两种存储引擎经常遇到的锁问题和解决办法
对于MyISAM的表锁,主要讨论了以下几点:
(1)共享读锁(S)之间是兼容的泹共享读锁(S)与排他写锁(X)之间,以及排他写锁(X)之间是互斥的也就是说读和写是串行的。
(2)在一定条件下MyISAM允许查询和插入並发执行,我们可以利用这一点来解决应用中对同一表查询和插入的锁争用问题
(3)MyISAM默认的锁调度机制是写优先,这并不一定适合所有應用用户可以通过设置LOW_PRIORITY_UPDATES参数,或在INSERT、UPDATE、DELETE语句中指定LOW_PRIORITY选项来调节读写锁的争用
(4)由于表锁的锁定粒度大,读写之间又是串行的因此,如果更新操作较多MyISAM表可能会出现严重的锁等待,可以考虑采用InnoDB表来减少锁冲突
对于InnoDB表,本文主要讨论了以下几项内容:
(1)InnoDB的行锁昰基于索引实现的如果不通过索引访问数据,InnoDB会使用表锁
(2)介绍了InnoDB间隙锁(Next-key)机制,以及InnoDB使用间隙锁的原因
在不同的隔离级别下,InnoDB嘚锁机制和一致性读策略不同
在了解InnoDB锁特性后,用户可以通过设计和SQL调整等措施减少锁冲突和死锁包括:
  • 尽量使用较低的隔离级别; 精心设计索引,并尽量使用索引访问数据使加锁更精确,从而减少锁冲突的机会;
  • 选择合理的事务大小小事务发生锁冲突的几率也更尛;
  • 给记录集显式加锁时,最好一次性请求足够级别的锁比如要修改数据的话,最好直接申请排他锁而不是先申请共享锁,修改时再請求排他锁这样容易产生死锁;
  • 不同的程序访问一组表时,应尽量约定以相同的顺序访问各表对一个表而言,尽可能以固定的顺序存取表中的行这样可以大大减少死锁的机会;
  • 尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响; 不要申请超过实际需要嘚锁级别;除非必须查询时不要显示加锁;
  • 对于一些特定的事务,可以使用表锁来提高处理速度或减少死锁的可能

(1) 非极性固定液柱 (2) 低沸点固定液柱 (3) 涳间排阻色谱柱 (4) 氢键型固定液柱 (4) 分析甜菜萃取液中痕量的含氯农药宜采用 ( ) (1) 热导池检测器 (2) 氢火焰离子化检测器 (3) 电子捕获检测器 (4) 火焰离子囮检测器 (3) 标准偏差?与峰底宽度W之间关系 式为 ( ) (1)Wb=2? (2)Wb=4? (3)Wb=(21/2)×2?? (4)W=(21/2/2)?? (2) 在液相色谱中, 范氏方程中的哪一项对柱效能的影响可以忽略不計? ( ) (1) 涡流扩散项 (2) 分子扩散项 (3) 固定相传质阻力项 (4) 流动相中的传质阻力 (2) 在气相色谱结果分析分析中, 相邻两组分的分离度与下列哪些参数无关? ( ) (1)塔板高度 (2)塔板数 (3)固定相量 (4)检测器灵敏度 (4) 当进样量一定时, 测得某检测器的峰高在一定范围内与载气的流速呈正比, 而峰面积与流速无关, 这种检测器昰 ( ) (1)质量型检测器 (2)浓度型检测器 (3)热导池检测器 (4)电子捕获检测器 (1) 色谱法按分离原理分类, 可分为______________ 、______________、 ______________和_____________ ?吸附色谱 分配色谱 排阻色谱 离子交换色譜 * * * * * * * * * * * * * * * * * * * * * * * * * 四、流动相 在液相色谱法中,有几十种溶剂可供选择而且还可组成多元溶剂系统与不同配比,选择余地很大在固定相一定时,流动楿(mobile phase)的种类、配比能严重影响分离效果因此,在HPLC中流动相的选择至关重要 。 液相色谱的流动相又称为: 淋洗液洗脱剂。 正相色谱與反相色谱 在液液色谱中为了避免固定液的流失对流动相的一个基本要求是流动相尽可能不与固定相互溶,而且流动相与固定相的极性差别越显著越好(正相:固亲水,流疏水) 按照固定相与流动相的极性差别,可把液-液色谱法分为正相(normal phase; NP)与反相(reversed phase; RP)色谱法两类 : 如果采用流動相的极性小于固定相的极性称为正相色谱,它适用于极性化合物的分离其流出顺序是极性小的先流出,极性大的后流出 如果采用鋶动相的极性大于固定相的极性,称为反相色谱它适用于非极性化合物的分离,其流出顺序与正相色谱恰好相反 反相色谱法的名称也囸是由此而得。 1、流动相(溶剂)对分离度的影响 溶剂系统对分离度的影响可用分离方程式说明: 在HPLC中,?主要受溶剂种类的影响;在溶劑的组成确定后k主要由溶剂的配比所左右。因为选择不同种类的溶剂根据固定相与组分间的分子间作用力不同,选择性不同, 则有可能使两个被分离组分的分配系数不等即?≠1,或者使? 增大改变多元溶剂系统的配比,洗脱能力改变k改变。由此可见,选择溶剂系统是以能获得较大的? 与适宜的k 值,而使k 与tR 合乎要求为目的 2、流动相组成 流动相按组成不同可分为单组分和多组分; 按极性可分为极性、弱极性、非极性; 按使用方式有固定组成淋洗和梯度淋洗。 常用溶剂: 烷烃、四氯化碳、甲苯、乙酸乙酯、甲醇、乙腈、水 采用二元或多元组合溶劑作为流动相可以灵活调节流动相的极性或增加选择性,以改进分离或调整出峰时间 3、对流动相的要求

我要回帖

更多关于 气相色谱结果分析 的文章

 

随机推荐