2008年02月10日

如果要用mysql的事务处理,mysql的表类型必须是:INNODB 和 BDB 两种类型的表;

比如有一个表表名为:demoTableName

用show create table demoTableName,可以查看demoTableName表的表类型;

结果为:

CREATE TABLE `demoTableName` (
`id` int(11) default NULL,
`name` varchar(50) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

可以看到表的类型是:MyISAM ,这个表是不支持事务的;要修改这个表的类型,可以直接修改

执行:ALTER TABLE demoTableName TYPE=INNODB;  就行了;

2008年01月14日

在tomcat的conf/server.xml中的<GlobalNamingResources>元素中添加如下内容:

<GlobalNamingResources>

<Resource
    name="jdbc/sqlservertest"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="45"
    username="sa"
    maxWait="180"
    driverClassName="net.sourceforge.jtds.jdbc.Driver"
    password="123456"
    url="jdbc:jtds:sqlserver://localhost:1433/test"
    removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>

<Resource
    name="jdbc/mysqltest"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="100"
    maxIdle="45"
    username="root"
    maxWait="180"
    driverClassName="com.mysql.jdbc.Driver"
    password="123456"
    url="jdbc:mysql://localhost:3306/test"
    removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>

</GlobalNamingResources>

以上配置了两个全局数据源,一个叫jdbc/sqlservertest,是SQLServer2000的,一个叫:jdbc/mysqltest,是mysql的

然后在web程序中写一个jsp:内容如下
<%@page import="java.util.*,javax.naming.*,java.sql.*,javax.sql.*" %>
<%@page contentType="text/html;charset=BIG5"%>
<%
    Context ctx = new InitialContext();
    String strLookup = "java:comp/env/jdbc/mysqltest2";
    DataSource ds =(DataSource) ctx.lookup(strLookup);
    Connection con = ds.getConnection();
    if (con != null){
        out.print("success");
    }else{
        out.print("failure");
    }
%>

然后将做个web工程发布到tomcat下;我用了两种方式发布:一种是war包的方式,一种是在server.xml中添加一个Context;
下面分别说说两种发布方式的区别:

war包方式:
如果要用war包方式发布web应用程序,又要使用JNDI数据源的话,要在你的web工程的META-INF文件夹下设置web项目的Context内容:
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/test">
    <ResourceLink global="jdbc/mysqltest" name="jdbc/mysqltest2" type="javax.sql.DataSource"/>
</Context>

global:就是tomcat的server.xml中配置的全局数据源名称。
name:就是你的web项目中要用的那个那个数据源的名称:也就是jsp中写的那个mysqltest2名称;

在server.xml中添加context的方式:
直接在server.xml中的<host></host>中添加如下内容:
<Context path="/test" docBase="c:/test" debug="0" reloadable="true">
       <ResourceLink global="jdbc/mysqltest" name="jdbc/huodong2" type="javax.sql.DataSource"/>
</Context>

 

2008年01月02日

Flex支持使用scale-9定义植入的图片。scale-9可以让你定义在一个图片上独立分割9个区域。这九个区域是由穿过图片两条水平线和两条竖线定义的,这样,图片的每条边会被分割成三个区域。如果图片有一些特殊的边,用普通的样式无法呈现,或者图片有圆角,scale-9可以使图片缩放的时候更加清晰。如果处理得好,可以看到图片缩放是甚至不会有明显的模糊感。很多时候我们用来这个方法来制作可以变尺寸的按钮,而这些按钮美工设计得美仑美奂,如果只是用美工的设计原稿图片来做按钮,当尺寸没有变化时效果非常好,但是当按钮的尺寸发生变化时,可能按钮会变得很丑。

如下图:

在mxml中的代码如下:

    <mx:Script>

      <![CDATA[

            [Embed(source="slice_9_grid.gif",

                scaleGridTop="5", scaleGridBottom="25",

                scaleGridLeft="7", scaleGridRight="60")]

            [Bindable]

            public var imgCls:Class;           

        ]]>

    </mx:Script>

这样引用图片就不会因为程序的放大和缩小而使图片伸缩。图片只会伸缩图片上标记为“伸缩部分”的地方。

2007年10月12日

    我以前遇到tomcat+mysql5中文乱码时都是去网上找解决办法,解决了后就不去深究原因,现在我总结一下:

  1:关于

        Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8"

与    Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=UTF-8"

写法的要注意的地方,&amp; 是 & 的转义符号,两种写法都是正确的,只是下面的写法用在xml配置文件中,而上面的用在java代码中。

2.查看客户端发送给服务器的SQL使用什么编码

如果你的jsp或者java代码发送给mysql的中文是乱码,你可以运行一下下面的代码,看看客户端发送给服务器的SQL使用什么编码;

private static String ClassName = "org.gjt.mm.mysql.Driver";
private static String Url = "jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8";
private static String UserName = "root";
private static String PassWord = "";

Connection con = null;
 try {
     Class.forName(ClassName).newInstance();
     con = DriverManager.getConnection(Url, UserName, PassWord);
 } catch (Exception e) {
     e.printStackTrace();
 }
 
ResultSet rs = con.createStatement().executeQuery("SHOW VARIABLES LIKE ‘character_set_%’");
   while(rs.next()){
      System.out.println(rs.getString(1) +","+ rs.getString(2));
   }
rs.close();
con.close();

没有配置characterEncoding=utf-8之前,我使用的是 Url = "jdbc:mysql://localhost:3306/test;
这样的配置。结果用select()方法查询结果如下:

character_set_client,latin1
character_set_connection,latin1
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-Linux-i686/share/mysql/charsets/

注意第一行就可以了,可见使用的是latin1。
而latin1本身就无法表示汉字,经过这个编码打包的SQL语句发给Server,Server也用Latin1解析也无法还原。
所以,我总是写乱码到DB。
而配置了配置characterEncoding=utf-8之后,
执行select(),结果:

character_set_client,utf8
character_set_connection,utf8
character_set_database,utf8
character_set_filesystem,binary
character_set_results,
character_set_server,latin1
character_set_system,utf8
character_sets_dir,/usr/local/mysql-standard-5.0.27-linux-i686/share/mysql/charsets/
第一行为utf-8,SQL将用UTF8打包给Server,Server也用Client配置的UTF8
解析。

部分类容来自 - http://www.master8.czm.cn/data/2007/0308/article_5458.htm

2007年09月18日

今天写了一个提交信息的jsp页面,页面的结构是这样的:

    index.jsp:主页面,其中有一个iframe,id=suggest,还有一个图片的的按钮;

   suggest.jsp提交意见的页面;其中有一个form表单,id为from1;

   我现在index中的图片按钮中提交suggest页面中的form1表单。开始我是这么写的:

   document.getElementById("suggest").document.forms[0].submit();

  或者document.getElementById("suggest").document.forms['form1'].submit();

 总是不能成功,后来改成了如下形式:

 window.frames[suggest].document.form1.submit();  就可以了。

2007年08月03日

        话说师徒四人走在取经路上,走的时间太长,人类科技已经迅猛发展了,神州到处都是手机移动基站,有一天走到一个驿站,看到“中国移动神州卡,一边取经一边打”的条幅,禁不住诱惑,就把紫金钵卖了,一人买了一个手机。

--------------------------

猪八戒一边走路,一边发短信给高老庄的娘子,同时跟蜘蛛精,蜈蚣精打情骂俏。
孙悟空的老家离大陆太远,还没有安装基站,所以花果山的猴子猴孙跟他联系不上,他很生气。

唐僧平时没什么人要打,只是不断地在手机上用账本管帐,馒头三只,咸菜两根…
沙僧比较精细,一边走路一边用手机照风景,然后在互联网上发表游记,同时赚稿费,取经路还没走到一半,他已经是知名游记作家了…

--------------------------

有一天走到一个小妖洞,妖怪出来劫道,孙悟空不慌不忙,连棒子都懒得提,直接给110打个电话,警察哥哥就把妖怪抓走了。。。

--------------------------

狮陀洞的三个妖精刚露面,孙悟空就拨通如来的电话,“如来吗?你们家的鸟,狮子,大象都跑出来了,赶紧把他们收了,不然我叫动物园!告你虐待动物!!”

-------------------------

唐僧每天给如来打个电话,喋喋不休,报告路上的艰难,如来不胜其烦,告诉手下,“赶紧把你们的妖精收了,让唐僧快点走,不然每天抱怨一回都快把我烦死了。”

------------------------

到了五庄观,镇元大仙把人参果奉上,猪八戒这回可精细了,拿出手机,在人参果上翻来覆去地看,大仙奇怪,问他看啥,八戒说,“找防伪标签打假货识别电话呀!”

-----------------------

四人到了一户寡妇家里借宿,半夜睡得正香,四人的手机都响了,不约而同地响起一个声音——“请问要找小姐吗?”孙悟空不耐烦地说,“黎山老母,南海菩萨,别装了,我们不会上当的,我认得你们的手机号码。”

----------------------

白骨精变成一个美貌女子,提着装满食物的篮子,想诱惑师徒四人上当,一直沉默的唐僧突然哈哈大笑,指着这个女子说,“她是妖精!”孙悟空好奇问道,“怎地师父也有火眼金睛?”唐僧骄傲地举着手里的手机说,“我这手机的摄像头有红外透视功能,五千两银子不是白花的,嘿嘿。”

----------------------

猪八戒偷看盘丝洞的蜘蛛精洗澡,被妖精用丝缠住了,一向懦弱的八戒不屑一顾,打开手机,播放了一下驱虫的铃声,在阵阵超声振荡波中,蜘蛛精八爪抽动,纷纷翻了白眼。八戒从网里出来说,“小样,你们还以为自己是蜘蛛侠呢?”

----------------------

四人到了通天河,见河面宽阔,一时难过,就到了陈老头家里借宿,陈老头诉苦说这河里的妖怪要吃他们家孩子,孙悟空大怒,给神州打击拐卖妇女儿童办公室打了个电话,过了半天,妖怪就挂了…四人乘着一只巨大无比的老鳖渡河,老鳖没别的请求,只想知道自己什么时候能得人身,猪八戒平时惯爱玩这些八卦玩意,打开手机,找了一个算命程序,输入老鳖的生辰八字,算了算说,“八百五十年之后,等着吧。”

----------------------

唐僧怀疑孙悟空用手机跟如来说他的坏话,就把孙悟空赶走了,孙悟空满脸郁闷,到龙宫作客,龙王一见孙悟空腰挎手机,羡慕的紧,也想买一个,孙悟空笑话他说,“水里没信号,你买了有个屁用?”说毕,把金箍棒从耳朵里抽出来,扔还给龙王,说,“自从老孙有了手机,再用不到这玩意了,还你还你!”

----------------------

唐僧手机的铃声是一段《菠萝蜜经》,闹钟是一阵当年他寺里的晨钟声;孙悟空手机的铃声是《男儿当自强》,闹钟是一段当年花果山的百灵鸟的叫声;猪八戒手机的铃声比较俗《月亮代表我的心》,闹钟是一声大喊“吃饭啦!!”;沙僧手机的铃声则就是普通的铃声,闹钟也根本没有——其他三个人的闹钟都响了,自己还用设么?

----------------------

唐僧赴女儿国国王的宴,明知此去凶多吉少,就事先安排孙悟空在几点几点给他打电话。酒过三巡,菜过五味,女儿国国王大眼睛就开始忽闪了,慢慢走到唐僧跟前,刚想勾搭,唐僧的手机响了,唐僧接电话,“喂,老婆啊,我还在饭局上,马上回家马上回家。”说罢,唐僧告了个罪,一溜烟跑了。

-----------------------

六耳猕猴冒充孙悟空,两猴从天上打到地上,打得天翻地覆,最后到了玉皇大帝殿前,玉皇大帝命取照妖镜来,照来照去,也看不出来。两猴飞到西天,请如来辨真假,如来也看不出来,突然灵机一动,拿起手机拨了一个号码,《男儿当自强》的歌声从其中一个猴的身上传出,如来大怒,指着另外一个猴说,“孽障!冒充孙悟空也不彻底点,这猴子的手机号码,你总冒充不得吧,拿下!”事后,悟空给神州移动写了封感谢信。

-----------------------

孙悟空被金角大王用葫芦装了,无法脱身。突然间葫芦里传来一阵声音——“我是太上老君,混蛋,怎么敢用葫芦装我?”金角大王认得是主人的声音,慌了,赶紧把葫芦打开,孙悟空跳出来,举着手机说,“嘿嘿,谢了,老君,改天请你吃饭。”

------------------------

四人来到火焰山,眼见熊熊大火阻路,悟空叫了雷公电母作法,只是这火不是凡火,水灭不得。悟空灵机一动,买了个短信群发器,发了条信息给几十万用户——“火焰山发现世界第一大金矿”。然后四人就舒舒服服地躺在山下,吃着喝着,看着闻风赶来的几万个承包商疯子一样用推土机把山挖平了。

------------------------

总算到西天了,四人轻轻松松,连兵器都卖了,到了西天大雷音寺,看见有个可乐机,每人掏出手机给这个机器发了一条信息,咕咚咕咚出来四个可乐。如来见四人这么轻松容易地靠着手机就到了西天,心里嫉妒,想再给他们出个难题,就给他们发了一批白纸经书,他们在回程的路上发现经书是假的,就回来找,那个阿迦侍者想敲诈,可是唯一值钱的紫金钵已经卖了,侍者想要他们的手机,没想到,四人不约而同地把经书丢还给他们说,“对不起,经俺们不取了,手机得留着。”猪八戒挖苦侍者说,“现在这经网上到处都是,还用得着来取?”

唐僧对着手机说,“阿琳呀(女儿国国王),我在西天大雷音寺,有空吗?有空的话派个波音747来接我。”

孙悟空对着手机说,“猴二啊,那批出口水果的合同签了没有?(花果山已经接上了电话,并开办了水果进出口公司)”

沙僧对着手机说,“第一版印刷30万吧,版税照老规矩。(沙僧已经是神州知名作家,名利双收)”

猪八戒对着手机说,“咱高老庄已经联产承包了?好好,还是党的政策好,我这就赶回去,咱开办个养猪场。”

 

转至:http://bbs.tech.163.com/board/tech02/71/66071.html

2007年07月27日

  <GlobalNamingResources>

    <!– Test entry for demonstration purposes –>
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>
    <!– Editable user database that can also be used by
         UserDatabaseRealm to authenticate users –>
   
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />
     
      <Resource
    name="jdbc/huodong"
    auth="Container"
    type="javax.sql.DataSource"
    maxActive="5"
    maxIdle="3"
    username="root"
    maxWait="180"
    driverClassName="org.gjt.mm.mysql.Driver"
    password=""
    url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&amp;characterEncoding=GBK"
    removeAbandoned="true" removeAbandonedTimeout="5" logAbandoned="true"
    testOnReturn="true" testWhileIdle="true"/>
  
  </GlobalNamingResources>

注意:url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&amp;characterEncoding=GBK"

不要写成:url="jdbc:mysql://localhost:3306/myDb?useUnicode=true&characterEncoding=GBK"

注意:&amp;  & 的转义字符;在xml中写成上面那个,在java代码中写成下面的写法;

否则报:

Parse Fatal Error at line 213 column 91: The reference to entity "characterEncoding" must end with the ‘;’ delimiter.
org.xml.sax.SAXParseException: The reference to entity "characterEncoding" must
end with the ‘;’ delimiter.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Un
known Source)

还要在tomcat的 conf/server.xml 中修改如下类容:

<Connector port="80" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="GBK"/>

红色部分是添加的类容

2007年06月16日

首先删除系统默认的totem前端,再安装toem-xine这个前端

   sudo apt-get remove totem
   sudo apt-get install totem-xine

  然后需要安装w32codecs这个解码器包,由于版权的问题,官方源中是没有这个包的,可以在如下地址下载

   http://www.debian-multimedia.org/pool/main/w/w32codecs/

  然后安装libxine1:

   sudo apt-get install libxine1*

  最后,还有编辑xine的配置文件

   gedit ~/.xine/catalog.cache
   
  在其中找到[/usr/lib/xine/plugins/1.1.4/xineplug_decode_real_audio.so],将把decoder_priority增加到10

  不作该修改的话,totem在播放rmvb的时候没有声音。

2007年05月07日

如果我们编译运行下面这个程序会看到什么?
public class Test{
    public static void main(String args[]){
        System.out.println(0.05+0.01);
        System.out.println(1.0-0.42);
        System.out.println(4.015*100);
        System.out.println(123.3/100);
    }
};
你没有看错!结果确实是
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。
这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。
在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。现在让我们看看如何解决这个问题。
 
四舍五入
我们的第一个反应是做四舍五入。Math类中的round方法不能设置保留几位小数,我们只能象这样(保留两位):
public double round(double value){
    return Math.round(value*100)/100.0;
}
非常不幸,上面的代码并不能正常工作,给这个方法传入4.015它将返回4.01而不是4.02,如我们在上面看到的
4.015*100=401.49999999999994
因此如果我们要做到精确的四舍五入,不能利用简单类型做任何运算
java.text.DecimalFormat也不能解决这个问题:
System.out.println(new java.text.DecimalFormat("0.00").format(4.025));
输出是4.02
 
BigDecimal
在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。BigDecimal一共有4个够造方法,我们不关心用BigInteger来够造的那两个,那么还有两个,它们是:
BigDecimal(double val) 
          Translates a double into a BigDecimal. 
BigDecimal(String val) 
          Translates the String repre sentation of a BigDecimal into a BigDecimal.
上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?等到出了问题的时候,才发现上面哪个够造方法的详细说明中有这么一段:
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding. 
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.
原来我们如果需要精确计算,非要用String来够造BigDecimal不可!在《Effective Java》一书中的例子是用String来够造BigDecimal的,但是书上却没有强调这一点,这也许是一个小小的失误吧。
 
解决方案
现在我们已经可以解决这个问题了,原则是使用BigDecimal并且一定要用String来够造。
但是想像一下吧,如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你能够忍受这么烦琐的过程吗?下面我们提供一个工具类Arith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:
public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
附录
源文件Arith.java:
import java.math.BigDecimal;
/**
 * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
 * 确的浮点数运算,包括加减乘除和四舍五入。
 */
public class Arith{
    //默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    //这个类不能实例化
    private Arith(){
    }
 
    /**
     * 提供精确的加法运算。
     * @param v1 被加数
     * @param v2 加数
     * @return 两个参数的和
     */
    public static double add(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }
    /**
     * 提供精确的减法运算。
     * @param v1 被减数
     * @param v2 减数
     * @return 两个参数的差
     */
    public static double sub(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    } 
    /**
     * 提供精确的乘法运算。
     * @param v1 被乘数
     * @param v2 乘数
     * @return 两个参数的积
     */
    public static double mul(double v1,double v2){
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }
 
    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
     * 小数点以后10位,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @return 两个参数的商
     */
    public static double div(double v1,double v2){
        return div(v1,v2,DEF_DIV_SCALE);
    }
 
    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
     * 定精度,以后的数字四舍五入。
     * @param v1 被除数
     * @param v2 除数
     * @param scale 表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1,double v2,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
 
    /**
     * 提供精确的小数位四舍五入处理。
     * @param v 需要四舍五入的数字
     * @param scale 小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v,int scale){
        if(scale<0){
            throw new IllegalArgumentException(
                "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
    }
};

 

转载至:http://chongtianpig.netbei.com/51976.shtml

基本上方法有两个:

      SET XACT_ABORT

指定当 Transact-SQL 语句产生运行时错误时,Microsoft&reg; SQL Server&#8482; 是否自动回滚当前事务。

语法
SET XACT_ABORT { ON | OFF }

注释
       当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行     时 错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的 Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。

对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是提供程序支持嵌套事务时。有关更多信息,请参见分布式查询和分布式事务。 

SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。

 

 

 例:

      

create proc testproc
as
SET XACT_ABORT on
begin tran
insert into tableA (field1) values (‘aa’)
insert into tableB (field1) values (‘bb’)
commit tran
SET XACT_ABORT off

 

begin tran
         /*要实现的操作*/
       commit tran
       if @@error>0
       rollback

 

     例:

    

  create proc testproc
      as

      begin tran
     insert into tableA (field1) values (‘aa’)
     insert into tableB (field1) values (‘bb’)
     commit tran
     if @@error>0
      rollback

另外,在.NET的ADO.NET数据库编程中,可以使用SqlTransaction实现事务操作。

   例:

    

Public Sub RunSqlTransaction()Sub RunSqlTransaction(myConnString As String)
    Dim myConnection As New SqlConnection(myConnString)
    myConnection.Open()
    
    Dim myCommand As SqlCommand = myConnection.CreateCommand()
    Dim myTrans As SqlTransaction
    
    ’ Start a local transaction
    myTrans = myConnection.BeginTransaction()
    ’ Must assign both transaction object and connection
    ’ to Command object for a pending local transaction
    myCommand.Connection = myConnection
    myCommand.Transaction = myTrans
    
    Try
      myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, ’Description’)"
      myCommand.ExecuteNonQuery()
      myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, ’Description’)"
      myCommand.ExecuteNonQuery()
      myTrans.Commit()
      Console.WriteLine("Both records are written to database.")
    Catch e As Exception
      Try
        myTrans.Rollback()
      Catch ex As SqlException
        If Not myTrans.Connection Is Nothing Then
          Console.WriteLine("An exception of type " & ex.GetType().ToString() & _
                            " was encountered while attempting to roll back the transaction.")
        End If
      End Try
    
      Console.WriteLine("An exception of type " & e.GetType().ToString()   "was encountered while inserting the data.")
      Console.WriteLine("Neither record was written to database.")
    Finally
      myConnection.Close()
    End Try
End Sub ’RunSqlTransaction