当前位置: 代码迷 >> DB2 >> 前辈们帮小弟我看看,事务锁的有关问题
  详细解决方案

前辈们帮小弟我看看,事务锁的有关问题

热度:3307   发布时间:2013-02-26 00:00:00.0
前辈们帮我看看,事务锁的问题
RetCode = SQLPrepare(StmtHandle, SQLStmt, SQL_NTS);

  sleep(20);

  RetCode = SQLExecute(StmtHandle);

  if (RetCode == SQL_SUCCESS)
  {
  SQLBindCol(StmtHandle, 1, SQL_C_CHAR, (SQLPOINTER) 
  name, sizeof(name), NULL);

  SQLBindCol(StmtHandle, 2, SQL_C_CHAR, (SQLPOINTER) 
  age, sizeof(age), NULL);

  while (RetCode != SQL_NO_DATA)
  {
  RetCode = SQLFetch(StmtHandle);
  if (RetCode != SQL_NO_DATA)
  printf("%-8s %s\n", name, age);
  }
  }
   
  printf("Tran completed.\n");
   
  RetCode = SQLEndTran(SQL_HANDLE_DBC, ConHandle,
  SQL_COMMIT);

按说SQLPrepare()会自动开启事务并加锁,可在执行程序等待的20秒里,我可以随便往表里插入数据

这怎么回事啊

------解决方案--------------------------------------------------------
这跟隔离级别有关,如果你要事务期间不能插入数据就把隔离级别设置为RR,在你的SQL语句后面加上WITH RR就行了。下面贴点关于隔离级别的内容供你参考:

引用
DB2数据库尝试强制实施并发性的方法之一是使用隔离级别,它决定在第一个事务访问数据时,如何对其他事务锁定或隔离该事务所使用的数据。DB2使用下列隔离级别来强制实施并发性:
可重复读(Reapeatable Read,RR)
读稳定性(Read Stability,RS)
游标稳定性(Cursor Stability,CS)
未提交的读(Uncommitted Read,UR)

隔离级别是根据称为现象(Phenomena)的三个禁止操作序列来声明的:
脏读(Dirty Read):在事务A提交修改结果之前,其他事务即可看到事务A的修改结果。
不可重复读(Non-Repeatable Read):在事务A提交之前,允许其他事务修改和删除事务A涉及的数据,导致事务A中执行同样操作的结果集变小。
幻像读(Phantom Read):事务A在提交查询结果之前,其他事务可以插入或者更改事务A涉及的数据,导致事务A中执行同样操作的结果集增大。

数据库并发性(可以同时访问同一资源的事务数量)因隔离级别不同而有所差异,可重复读隔离级别可以防止所有现象,但是会大大降低并发性。未提交读隔离级别提供了最大的并发性,但可能会造成“脏读”、“幻像读”或“不可重复读”现象。DB2默认的隔离级别是CS。

------解决方案--------------------------------------------------------
SQLPrepare()阶段还没执行,要等执行了再加锁
------解决方案--------------------------------------------------------
不指定是db2默认隔离级别:CS(游标稳定性)
如果在程序里指定隔离级别,那么将覆盖默认的CS隔离级别

即使是默认的CS隔离级别,那么update一个表,将锁定相应的目标
  相关解决方案