精华内容
下载资源
问答
  • 关于编程语言中的时间格式和关系型数据中的中时间格式问题的转化一直都是个简单而又不得不权衡的问题,这牵扯到数据库设计和SQL编程和应用程序中时间格式数据的处理的编程,两者总能够交缠在一起。  关于Java中的...
  • Delphi数据库编程技巧

    2017-11-22 19:32:00
    我原来在万千的新闻组(news://news.webking.com.cn/)Delphi版上闲逛那段时间,发现经常有人提出一些数据库方面的技巧性问题问题其实不难,但是要一个简单的解决方案,可能也破费思量,特别在此简单谈谈: ...

    我原来在万千的新闻组(news://news.webking.com.cn/)Delphi版上闲逛那段时间,发现经常有人提出一些数据库方面的技巧性问题,问题其实不难,但是要一个简单的解决方案,可能也破费思量,特别在此简单谈谈:

    1. 如何动态设置ODBC源

    很多时候程序员需要自动生成ODBC数据源,而不是指导客户"打开控制面板… … ",到底如何去做呢?相信很多人会选择编程修改注册表来实现这项功能,因为ODBC的详细信息全部存放在注册表的下述键值内:

    "HKEY_LOCAL_MACHINE\SOFTWARE\ODBC"

    修改一下ODBC的配置,通过前后的注册表比较,你可以发现一定的规律。在这里我只是想说,哥们,别这么犯傻了(如果我让你写一个通用的ODBC源处理程序,你得累死),用这个Windows ODBC API函数吧,

    function SQLConfigDataSource(hwndParent: Integer; fRequest: Integer;

    lpszDriverString: String; lpszAttributes: String): Integer;

    stdcall;external ''ODBCCP32.DLL'';

    了解数据库编程的朋友都知道,数据库的访问方式不论DAO、ADO、ODBC或是BDE或是其它第三方的数据库连接控件,归根结底,都是一些个函数集,只要你愿意,你可以编写出自己的数据库访问方式用以替代。深入研究这些底层函数,很多时候会为你提供相当地便利。 

    SQLConfigDataSource这个函数MSDN有详细的说明,我不想整段翻译下来让你扁我,我只是结合流行的SQL Server谈谈如何有技巧的调用该函数。其它的数据库大同小异。

    SQLConfigDataSource(0, ODBC_ADD_SYS_DSN,''SQL Server'', 
    ''DSN=Record_ODBC''+ chr(0) + 
    ''Server=(local)''+ chr(0) + 
    ''Database=master''+ chr(0) + 
    ''Description=DragonPC SQLServer ODBC Source''+ chr(0));


      这是我的Delphi程序中调用该函数的一个实例,第一个参数是父窗口句柄,设置为0则该函数不显示任何对话框。第二个参数是操作类型,你需要定义如下的操作类型常量: 

    Const
    ODBC_ADD_DSN = 1; // Add a new user data source.
    ODBC_CONFIG_DSN = 2; // Configure (modify) an existing user data source.
    ODBC_REMOVE_DSN = 3; // Remove an existing user data source.
    ODBC_ADD_SYS_DSN = 4; // Add a new system data source.
    ODBC_CONFIG_SYS_DSN = 5; // Modify an existing system data source.
    ODBC_REMOVE_SYS_DSN = 6; // Remove an existing system data source.


      从名字我们知道,要添加ODBC源,我们需要调用的是ODBC_ADD_SYS_DSN 或是ODBC_ADD_DSN参数。第三个参数也没有什么好说的,我们添加的是SQL Server数据库的ODBC源,所以填入''SQL Server''参数,如果需要建立Excel文件的ODBC数据源,我们可以填入''Excel Files (*.xls)'',这些字符串参数相信各位同志在添加ODBC源时,已经多次见过。

      关键的是第三个参数的设置,不同的数据库类型所支持的关键字是不一样的,这里仅仅就SQL Server所支持的关键字作一个简单说明:

      DSN:你的ODBC数据源名称。

      Server:你的数据库服务器名称,使用(local)指的是本地计算机安装的数据库。注:最新的SQL Server 2000支持一台计算机运行多个SQL Server服务,这个时候你需要指定SqlSever的InstanceName。

      Address:指定SQL Server服务器的网络IP地址。

      Database:指定默认数据库名称。

      Language:指定默认语言。

      Description:备注信息。

      详细的参数和信息可以查阅微软网站的以下网址。

      http://msdn.microsoft.com/library/psdk/dasdk/odch3kit.htm

      http://msdn.microsoft.com/library/psdk/sql/od_odbc_c_99yd.htm

    2. 如何动态设置BDE别名

    这个问题其实是考察程序员对BDE的TSession组件的熟悉程度,一个数据库程序的建立,即使你没有显式的添加TSession组件,系统中依然存在一个名字为Session的TSession对象,你可以在任何位置调用该对象的方法和属性。TSession类的很多方法可以帮助我们的应用程序获取系统BDE环境,下面介绍一个代码片断用以添加一个BDE别名:


    var
    BDEList : TStringList ;
    ...
    begin
    ...
    BDEList := TStringList.Create () ; 
    try
    Session.GetAliasNames(BDElist) ; // 获取系统所有BDE别名列表
    if BDEList.IndexOf(''DragonPC'')= -1 then begin // 如果没有我们的BDE别名"DragonPC"
    BDEList.Clear ;
    BDEList.Add(''SERVER NAME='' + ''SQLServerName'')); // 数据库服务器名称
    BDEList.Add(''DATABASE NAME=master'') ; // 默认数据库
    BDEList.Add(''USER NAME=sa''); // 用户名
    Session.AddAlias(''DragonPC'', ''MSSQL'', BDEList) ; // 添加一个MSSQL类型的BDE别名
    ShowMessage(''系统即将建立BDE别名!'') ;
    Session.SaveConfigFile() ; // 存储BDE配置
    end;
    finally
    BDEList.Free ;
    end;


      这么简单,用户就可以随时建立、删除和修改BDE别名(有兴趣的朋友可以查看TSession组件的源代码,看看调用了哪些BDE函数)。另外像DeleteAlias,ModifyAlias,GetDatabaseNames,GetDriverNames,GetStoredProcNames,GetTableNames,GetPassword等等TSession类的方法,使用起来非常简单,通过Delphi的随机帮助,读者可以试着自己调用一下看看。通过对Session的灵活应用,再配合我下面将要提到的扑捉SQL异常的技巧,你完全可以写一个媲美SQL Explorer的通用数据库查询工具。

    3. 如何扑捉运行SQL语句时的错误

    老是有朋友在开发一些开放的数据库接口(比如Delphi的SQL Explorer工具)时发愁,既然是开放的,当然需要允许用户使用SQL语句访问数据库,这些还好办,一旦用户的运行SQL语句出现错误,程序员如何扑捉该异常呢?很简单,看看下面的函数: 


    Const
    ExecSQLMode = 0 ;
    OpenSQLMode = 1 ;
    ResultRight = ''SQL query result is right'' ;
    ...
    function RunSql(RunQuery: TQuery; Sqls: TStringList; var ErrorMsg: string; 
    Mode: integer) : integer ; 
    begin
    ErrorMsg := ResultRight ;
    Result := 0 ;
    try
    RunQuery.DatabaseName := ''RecordDB'' ;
    RunQuery.SQL.Clear() ;
    RunQuery.SQL.AddStrings(Sqls) ;
    if Mode = ExecSQLMode then
    RunQuery.ExecSQL()
    else
    RunQuery.Open() ;
    except
    on e:exception do 
    ErrorMsg := e.Message + #13 + #10 +''--- 错误是俺发现的 ---'' ;
    end;
    end;


      朋友看明白了吧,我的函数很简单,将SQL语句代码段作为参数传递给TQuery组件,通过设置查询方式(ExecSQLMode、OpenSQLMode)来处理有结果集返回的数据查询语句(select)或是没有结果集返回的数据操作语言(update、delete、insert、create等)。而异常的扑捉呢,我们扑捉所有异常的老祖宗Exception,因为Delphi的所有异常都是从Exception继承下来的,这样一个简单的SQL语句运行和异常处理函数就完成了,一旦返回的ErrorMsg的值不是ResultRight,ErrorMsg就会返回异常的信息,程序员就可以加以判断以处理不同的情况。











    本文转自鹅倌51CTO博客,原文链接: http://blog.51cto.com/kaixinbuliao/1198698,如需转载请自行联系原作者




    展开全文
  • 关于编程语言中的时间格式和关系型数据中的中时间格式问题的转化一直都是个简单而又不得不权衡的问题,这牵扯到数据库设计和SQL编程和应用程序中时间格式数据的处理的编程,两者总能够交缠在一起。关于Java中的时间...

    关于编程语言中的时间格式和关系型数据中的中时间格式问题的转化一直都是个简单而又不得不权衡的问题,这牵扯到数据库设计和SQL编程和应用程序中时间格式数据的处理的编程,两者总能够交缠在一起。

    关于Java中的时间格式和数据库中的时间格式转换在这里先写两个方法:

    /**

    *

    * @param utilDate

    * @return

    */

    publicstaticjava.sql.Date convertUtilDateToSqlDate(java.util.Date utilDate) {

    java.sql.Date sqlDate =newjava.sql.Date(utilDate.getTime());

    returnsqlDate;

    }

    /**

    *

    * @param sqlDate

    * @return

    */

    publicstaticjava.util.Date convertSqlDateToUtilDate(java.sql.Date sqlDate){

    java.util.Date utilDate =newjava.util.Date(sqlDate.getTime());

    returnutilDate;

    }

    普通的转换是很容的,但是想要获取到一定的格式就得下些功夫了。

    1.从应用程序中向数据库中写入字段类型为Date类型的数据

    比如:PreparedStatement.setDate(int ,java.sql.Date)方法 说明:其中的java.sql.Date可以用上面的方法转化得到

    比如:TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),"YYYY-  MM-DD HH24:MI:SS")

    可以通过SQL语句进行处理:SQL=“UPDATE TABLENAME SET TIMER = TO_DATE(" "+ TIMEMISS +" ", ' yyyymmddhh24miss' ) WHERR ... ” 注 TIMEMISS 为变量  例如:20080522131223 类型

    2.将指定格式的字符串转换为数据库的时间类型java.sql.Date通过如下方法可以实现:

    方法一:

    publicstaticjava.sql.Date convertStringToSqlDate(String formatStr, String timeStr) {

    SimpleDateFormat bartDateFormat =newSimpleDateFormat(formatStr);

    java.sql.Date sqlDate =null;

    try{

    java.util.Date date = bartDateFormat.parse(timeStr);

    sqlDate =newjava.sql.Date(date.getTime());

    System.out.println(sqlDate.getTime());

    }catch(Exception ex) {

    System.out.println(ex.getMessage());

    }

    returnsqlDate;

    }

    方法二:

    String strDate ="2002-08-09";

    StringTokenizer st =newStringTokenizer(strDate,"-");

    java.sql.Date date =newjava.sql.Date(Integer.parseInt(st.nextToken()));

    这样通过不同的方式都可以解决这个问题。

    3.关于java.sql.Date与java.sql.Date

    java.sql.Date是为了配合SQLDATE而设置的数据类型。

    “规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。

    当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

    在sun提供的ResultSet.java中这样对getDate进行注释的:

    Retrieves the of the designated column in the current row of this ResultSet object as a “java.sql.Date” object in the Java programming language.

    如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).

    显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,这个时候java.sql.Timestamp.算是一个比较好的选择。

    4.一刀切的做法

    关于这个做法曾经在我身边发生过一些小小的争议,有一个老师告诉我们在数据库中使用时间类型的时候统统设置为字符串类型,而另一个老师是在应用程序开发的告诉我们那样设计数据库表字段是最不专业的做法。可是最后发现如果在应用程序中将时间数据作为java.util.Date,而在数据库中时间数据字段类型为Date类型,那么在进行时间数据更新或者查询方面都将是上面一大堆的转化方式显的格外有意义。

    后来将这个问题想了想,为什么没有为关于这两个类型做一个适配器的东西类进行转换,这样不是更方便了。

    现在似乎明白了些。如果数据库中是时间字段的更新来自数据库服务器的操作,那么大可放心的使用数据库中的时间类型,而且从数据库中读出数据在应用程序中转换相当容易和自由;相反,如果数据库中的时间字段的更新来自外部应用程序,那么可以将数据库中的时间类型字段设计为字符串类型,因为对于数据库来讲它是服务于应用程序的,而且这样来自外部的时间格式将更容易控制和设置。

    5.可以一劳永逸       粗略的想一下没有类似时间格式的转换是应为我们在实际应用中需要展现的时间格式显示是千变万化的,因此只能通过对特定的业务需求进行分析编写一个工具类来处理这些问题,当然这样的工作也是一劳永逸的。

    这里列一个处理:

    //获得当前时间,声明时间变量

    Calendar calendar = Calendar.getInstance();

    //得到年

    intyear = calendar.get(Calendar.YEAR);

    //得到月,但是,月份要加上1

    intmonth = calendar.get(Calendar.MONTH) +1;

    //获得日期

    intday = calendar.get(Calendar.DATE);

    //字符串转换成日期时间格式

    String today =""+ year +"-"+ month +"-"+ day +"";

    好了,时间不多了,一劳永逸是建立在高度的抽象再抽象,分析提取在分析的基础上的。

    展开全文
  • 关于编程语言中的时间格式和关系型数据中的中时间格式问题的转化一直都是个简单而又不得不权衡的问题,这牵扯到数据库设计和SQL编程和应用程序中时间格式数据的处理的编程,两者总能够交缠在一起。关于Java中的时间...

    关于编程语言中的时间格式和关系型数据中的中时间格式问题的转化一直都是个简单而又不得不权衡的问题,这牵扯到数据库设计和SQL编程和应用程序中时间格式数据的处理的编程,两者总能够交缠在一起。

    关于Java中的时间格式和数据库中的时间格式转换在这里先写两个方法:

    /**

    *

    * @param utilDate

    * @return

    */

    publicstaticjava.sql.Date convertUtilDateToSqlDate(java.util.Date utilDate) {

    java.sql.Date sqlDate =newjava.sql.Date(utilDate.getTime());

    returnsqlDate;

    }

    /**

    *

    * @param sqlDate

    * @return

    */

    publicstaticjava.util.Date convertSqlDateToUtilDate(java.sql.Date sqlDate){

    java.util.Date utilDate =newjava.util.Date(sqlDate.getTime());

    returnutilDate;

    }

    普通的转换是很容的,但是想要获取到一定的格式就得下些功夫了。

    1.从应用程序中向数据库中写入字段类型为Date类型的数据

    比如:PreparedStatement.setDate(int ,java.sql.Date)方法 说明:其中的java.sql.Date可以用上面的方法转化得到

    比如:TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),"YYYY-  MM-DD HH24:MI:SS")

    可以通过SQL语句进行处理:SQL=“UPDATE TABLENAME SET TIMER = TO_DATE(" "+ TIMEMISS +" ", ' yyyymmddhh24miss' ) WHERR ... ” 注 TIMEMISS 为变量  例如:20080522131223 类型

    2.将指定格式的字符串转换为数据库的时间类型java.sql.Date通过如下方法可以实现:

    方法一:

    publicstaticjava.sql.Date convertStringToSqlDate(String formatStr, String timeStr) {

    SimpleDateFormat bartDateFormat =newSimpleDateFormat(formatStr);

    java.sql.Date sqlDate =null;

    try{

    java.util.Date date = bartDateFormat.parse(timeStr);

    sqlDate =newjava.sql.Date(date.getTime());

    System.out.println(sqlDate.getTime());

    }catch(Exception ex) {

    System.out.println(ex.getMessage());

    }

    returnsqlDate;

    }

    方法二:

    String strDate ="2002-08-09";

    StringTokenizer st =newStringTokenizer(strDate,"-");

    java.sql.Date date =newjava.sql.Date(Integer.parseInt(st.nextToken()));

    这样通过不同的方式都可以解决这个问题。

    3.关于java.sql.Date与java.sql.Date

    java.sql.Date是为了配合SQLDATE而设置的数据类型。

    “规范化”的java.sql.Date只包含年月日信息,时分秒毫秒都会清零。格式类似:YYYY-MM-DD。

    当我们调用ResultSet的getDate()方法来获得返回值时,java程序会参照"规范"的java.sql.Date来格式化数据库中的数值。因此,如果数据库中存在的非规范化部分的信息将会被劫取。

    在sun提供的ResultSet.java中这样对getDate进行注释的:

    Retrieves the of the designated column in the current row of this ResultSet object as a “java.sql.Date” object in the Java programming language.

    如果我们把一个java.sql.Date值通过PrepareStatement的setDate方法存入数据库时,java程序会对传入的java.sql.Date规范化,非规范化的部分将会被劫取。然而,我们java.sql.Date一般由java.util.Date转换过来,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).

    显然,这样转换过来的java.sql.Date往往不是一个规范的java.sql.Date.要保存java.util.Date的精确值,这个时候java.sql.Timestamp.算是一个比较好的选择。

    4.一刀切的做法

    关于这个做法曾经在我身边发生过一些小小的争议,有一个老师告诉我们在数据库中使用时间类型的时候统统设置为字符串类型,而另一个老师是在应用程序开发的告诉我们那样设计数据库表字段是最不专业的做法。可是最后发现如果在应用程序中将时间数据作为java.util.Date,而在数据库中时间数据字段类型为Date类型,那么在进行时间数据更新或者查询方面都将是上面一大堆的转化方式显的格外有意义。

    后来将这个问题想了想,为什么没有为关于这两个类型做一个适配器的东西类进行转换,这样不是更方便了。

    现在似乎明白了些。如果数据库中是时间字段的更新来自数据库服务器的操作,那么大可放心的使用数据库中的时间类型,而且从数据库中读出数据在应用程序中转换相当容易和自由;相反,如果数据库中的时间字段的更新来自外部应用程序,那么可以将数据库中的时间类型字段设计为字符串类型,因为对于数据库来讲它是服务于应用程序的,而且这样来自外部的时间格式将更容易控制和设置。

    5.可以一劳永逸       粗略的想一下没有类似时间格式的转换是应为我们在实际应用中需要展现的时间格式显示是千变万化的,因此只能通过对特定的业务需求进行分析编写一个工具类来处理这些问题,当然这样的工作也是一劳永逸的。

    这里列一个处理:

    //获得当前时间,声明时间变量

    Calendar calendar = Calendar.getInstance();

    //得到年

    intyear = calendar.get(Calendar.YEAR);

    //得到月,但是,月份要加上1

    intmonth = calendar.get(Calendar.MONTH) +1;

    //获得日期

    intday = calendar.get(Calendar.DATE);

    //字符串转换成日期时间格式

    String today =""+ year +"-"+ month +"-"+ day +"";

    好了,时间不多了,一劳永逸是建立在高度的抽象再抽象,分析提取在分析的基础上的。

    本文出自 “野马红尘” 博客,谢绝转载!

    展开全文
  • 在unity中如何编写连接数据库的程序,而且要求游戏过关后,有总的游戏运行报告。包括积分,运行时间等,并计入数据库
  • 它描述了两个或多个用户都想在同一时间里对某一数据修改时,会产生一定的并发问题。使用事务便可以解决用户存取数据时出现的这个问题,从而保持数据库的完整性和一致性。然而如果希望防止其他用户修改另一个还没完成...

    4.6锁

    并发性(concurrency)是任何数据库系统中的一个主要问题。它描述了两个或多个用户都想在同一时间里对某一数据修改时,会产生一定的并发问题。使用事务便可以解决用户存取数据时出现的这个问题,从而保持数据库的完整性和一致性。然而如果希望防止其他用户修改另一个还没完成的事务中的数据,就必须在事务中使用锁。

    4.6.1并发问题

    当多个用户同时访问同一数据库,并且他们的事务同时使用的数据,则就可能发生并发问题。锁能阻止4种主要问题包括:脏读、丢失更新、幻读、不一致的分析。

    1.脏读

    脏读是指当事务在读取一条仍处于被更改状态的数据时,就会出现这个问题。比如,事务A访问到一条数据,并对该数据进行修改,当这种修改还未提交到数据库时,事务B也访问了这条数据,并使用了事务A修改后的数据,由于该数据未提交,所以事务B使用这个数据就是脏数据,就可能产生错误的操作结果。

    2.丢失更新

    丢失更新是指事务A、事务B同理对一数据进行修改。当事务A把修改结果成功提交到数据以后,事务B也成功提交到数据中,那么数据库中保存则是事务B修改后的数据,而事务A修改的数据丢失。

    3.幻读

    幻读是指当事务不是独立执行时发生的一种现象。比如,事务A对一个表的数据进行修改,这种修改涉及到表中的全部数据行。同时,事务B也修改了这个表中的数据,但是只向表中插入了一行数据,那么,以后就会发生这样的情况:操作事务B的用户更新后,却发现表中还有尚未修改的数据行,这就是幻读。

    4.不一致的分析

    不一致的分析与脏读问题有关,不一致的分析是由不可重复的读取造成的。比如,编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。这样就发生了编辑人员两次读取的数据是不一样的情形。

    4.6.2锁模式

    在SQL Server数据库中加锁时,除了可以对不同的资源加锁,还可以使用不同程度的加锁方式。SQL Server中提供了多种锁方式,主要包括:共享锁、排它锁、更新锁、意向锁、模式修改锁、模式稳定锁和大容量更新锁。

    1.共享锁

    在SQL Server中,共享锁用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。默认情况下,数据被读取后,SQL Server立即释放共享锁。例如,执行查询“SELECT * FROM AUTHORS”时,首先锁定第一页,读取之后,释放对第一页的锁定,然后锁定第二页。这样,就允许在读操作过程中,修改未被锁定的第一页。但是,事务隔离级别连接选项设置和SELECT语句中的锁定设置都可以改变SQL Server的这种默认设置。例如,“ SELECT * FROM AUTHORS HOLDLOCK”就要求在整个查询过程中,保持对表的锁定,直到查询完成才释放锁定。

    2.排它锁

    排它锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。

    3.更新锁

    更新锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。因为使用共享锁时,修改数据的操作分为两步,首先获得一个共享锁,读取数据,然后将共享锁升级为排它锁,然后再执行修改操作。这样如果同时有两个或多个事务同时对一个事务申请了共享锁,在修改数据的时候,这些事务都要将共享锁升级为排它锁。这时,这些事务都不会释放共享锁而是一直等待对方释放,这样就造成了死锁。如果一个数据在修改前直接申请更新锁,在数据修改的时候再升级为排它锁,就可以避免死锁。

    4.意向锁

    意向锁说明SQL Server有在资源的低层获得共享锁或排它锁的意向。例如,表级的共享意向锁说明事务意图将排它锁释放到表中的页或者行。意向锁又可以分为共享意向锁、独占意向锁和共享式独占意向锁。共享意向锁说明事务意图在共享意向锁所锁定的低层资源上放置共享锁来读取数据。独占意向锁说明事务意图在共享意向锁所锁定的低层资源上放置排它锁来修改数据。共享式排它锁说明事务允许其他事务使用共享锁来读取顶层资源,并意图在该资源低层上放置排它锁。

    l   模式修改锁

    执行表的数据定义语言操作时使用模式修改锁

    l   模式稳定锁

    当编译查询时,使用模式稳定锁。模式稳定锁不阻塞任何事务锁,包括排它锁。因此在编译查询时,其他事务都能继续运行,但不能在表中执行DDL操作。

    l   大容量更新锁

    当将数据大容量复制到表,且指定了 TABLOCK 提示或者使用 sp_tableoption 设置了 table lock on bulk 表选项时,将使用大容量更新锁。大容量更新锁允许进程将数据并发地大容量复制到同一表,同时防止其它不进行大容量复制数据的进程访问该表。

    4.6.3查看锁

    对于数据管理员来说,了解服务器上正处于使用状态的锁的情况是非常必要的。

    SQL Server提供了几个有用的工具,可以来了解SQL Server加锁系统上正在发生的事情。比如,使用sys.dm_tran_locks动态管理视图和使用 SQL Server Management Studio的查看加锁情况。

    1.使用sys.dm_tran_locks视图

    使用sys.dm_tran_locks视图可以快速了解SQL Server内的加锁情况。在默认情况下,任何一个拥有VIEW SERVER STATE 权限的用户均可以查询sys.dm_tran_locks视图。

    sys.dm_tran_locks视图有两个主要用途。第一个用途是帮助数据库管理员查看服务器上的锁,如果sys.dm_tran_locks视图的输出包含许多状态为WAIT或CONVERT的锁,就应该怀疑存在死锁问题。例如,在查询窗口中输入下列语句:

    select  *  from  sys.dm_tran_locks

    执行该语句,运行结果如图4-15所示

    图4-15 使用sys.dm_tran_locks视图

    第二个用途是sys.dm_tran_locks视图可以帮助了解一条特定SQL语句所置的实际锁,因为用户可以检索一个特定进程的锁。例如,执行下面的一个事务操作语句:

    USE BookDateBase

    BEGIN TRAN

    INSERT INTO [BookDateBase].[dbo].[Books]

         VALUES

    ('9787512500983','1988--我想和你谈谈这个世界','韩寒'

    ,'国际文化出版公司'

    ,'2010-09-01'

    ,'20.00'

    ,'小说'

    ,'中国当代小说'

    ,20

    ,'韩寒写过的最好的小说')

    SELECT * FROM sys.dm_tran_locks

    ROLLBACK TRANSACTION

    在上述语句中,在设置了要使用的数据库之后,这个批处理首先开始一个事务,因为锁只有在当前事务运行期间才能被保持住。通过让事务保持执行,可以在SQL Server释放这前检查它们。下一条语句INSERT是实际请求锁的语句。随后一条语句是sys.dm_tran_locks视图显示当前事务的锁而使用的形式。最后的语句是回滚事务,不对数据库执行修改。执行上述语句,执行结果如图4-16所示。

    图4-16 执行特定进程

    2.使用SQL Server Management Studio

    使用SQL Server Management Studio可以实现图形化显示加锁信息。启动SQL Server Management Studio,展开【管理】节点,在该节点下双击【活动监视器】节点。打开【活动监视器】窗口,如图4-17所示。

    展开全文
  • jsp编程中,如果使用类的static变量保持数据库连接,时间长了会不会有问题? ![图片说明](https://img-ask.csdn.net/upload/201608/16/1471347546_9065.png) 然后使用DataConnect.This访问这个类,使用这个...
  • ssm java编程遇到从数据库中查询的时间与存储时间不一致推荐先去看这篇文章: java编程中遇到的时区与时间问题总结 http://blog.csdn.net/yeahwell/article/details/8559996 这几天开发中遇到一个问题:ssm中使用...
  • 使用MFC ODBC +SQL Server2005 实现数据库编程

    千次阅读 热门讨论 2007-09-20 18:33:00
    由于以前没有接触过数据库具体的实现,因此花了两周时间学习了数据库的知识,并实现了项目中的基本功能。感觉虽然存在很多问题,但还是有不少收获。下面总结一下,希望能够给跟我一样的新手们一个参考,大家共同学习...
  • 它描述了两个或多个用户都想在同一时间里对某一数据修改时,会产生一定的并发问题。使用事务便可以解决用户存取数据时出现的这个问题,从而保持数据库的完整性和一致性。然而如果希望防止其他用户修改另一个还没完成...
  •  上周在把程序拿去调试的时候,发现程序运行不正常。...而由于本机设置的时间是中文格式的,所以数据库中的时间也是中文格式的,包含有中文,转换为数据的时间字符串相减时,就出问题了。此时,把数据库
  • 怎么样编程实现这样时间的拆分? seq date begintime endtime 1 2014-8-1 16:9 2014-8-1 16:59 1 2014-8-1 17:0 2014-8-1 17:59 1 2014-8-1 18:0 2014-8-1 18:11 2 2014-8-2 15:0 2014-8-2 15:11
  • 编程中,如果使用DateTimePicker控件,获得的时间会自动带上时间。在数据库中查询时,就会漏查记录:string Time1 = this.TimeBegin.Value.ToString("yyyy-MM-dd").Trim()同时输入参数改成varchar即可InputTime>...
  • Golang orm数据库访问时区问题

    千次阅读 2018-07-02 20:53:36
    最在在学golang 有java的基础学go还是很方便的学习beego框架时踩了一个坑 虽然这种坑不是第一次踩了 每个编程语言都有自己的解决方法具体问题就是插入时间和mysql存储时间相差了八小时因为是很有规律的八小时 首先...
  • django数据库 时间数据传输Bug修改与体会--Einste的django结队编程  本人虽然不是第一次使用django来做一些轻量级的数据库开发,但是之前的开发都是做一些简单的库,无论是django在传输数据上的快速性还是django...
  • 一、 编写有效事务的指导原则 不要在事务处理期间要求用户输入或消息响应。 在事务启动之前,获得...事务占用的所有资源都要保持很长的时间,这就有可能造成阻塞问题。如果用户没有响应,该事务就会仍保持活动状
  • 今天忽然想到这个问题,为什么众多编程语言都以 1970-01-01 00:00:00 作为计时起点??为什么开机时间(秒)要从1970年1月1日0时开始计算?...为什么编程语言以及数据库要从1970年1月1日开始计算时间 今天在看Pytho...
  • 偶然看到你这个问题,心血来潮回答一下。你和当初我学这门课的时候的心态应该差不多:这个门课又不教编程又不教算法,没有一点实际用途,学来干嘛?还不如自己去学点mysql\oracle啥的实用。学校真垃圾,想着法子浪费...
  • 今天忽然想到这个问题,为什么众多编程语言都以 1970-01-01 00:00:00 作为计时起点??为什么开机时间(秒)要从1970年1月1日0时开始计算?? ...为什么编程语言以及数据库要从1970年1月1日开...
  • 经过数次实践,本人认为在编程时应注意一下问题: 1、如果程序中有大量数据库读写操作(尤其是写操作),通过并行手段来缩短程序运行时间是不可行的。因为影响时间的主要因素是数据库的读写操作,并行的线程越多,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,625
精华内容 650
关键字:

数据库编程时间问题