sql事务的理解

    技术2022-05-11  14

     

    以前总觉得使用事务会降低性能

    这个blog的结果相反

     

    最近真的是很闲,在公司里主任大概是抱着让我学习的目的让我自学,他都不管我了,

    都来一个多月了,做的东西少的可怜, 就象我以前说的那样,我其实是不怎么喜欢清闲的.

    ======================================================

    今天在看公司以前一个系统的时候,看到其中数据访问层里有着大量的冗余代码,就自己想着

    说我能不能改改, 不说减少很多,但多少减少一点,在写的时候,想到更新数据时如果出错了,怎么办?

    也就想到了事务,但事务的效率又怎么样呢?会象网上说的,有一些还原点,会浪费资源,等等,都不能让人

    相信,所以只能靠自己了,为此我做了一些试验,自己来验证

    1    在数据库中试验

    1.1  没有使用事务

    代码如下:

    DECLARE @startTime DATETIMESET @startTime=GETDATE()exec('SP_InsertTest')SELECT Eclepse_Time=DATEDIFF(MS,@startTime,GETDATE())----------------------------------------------------------ALTER PROCEDURE [dbo].[SP_InsertTest]    ASBEGIN    DECLARE @i INT    SET @i=0    WHILE @i<100000    BEGIN        INSERT INTO InsertTest         VALUES(@i,'abc','abc','www','123')        SET @i=@i+1    ENDEND

    插入100000條數據用時71126ms 

    插入300000條數據用時215000ms插入500000條數據用時356190ms  

    插入1000000條數據用時785453ms

     

    1.2  使用事务

    代码如下:

    ALTER PROCEDURE [dbo].[SP_InsertTest_Tran]    ASBEGIN    BEGIN TRANSACTION    DECLARE @i INT    SET @i=0    WHILE @i<100000    BEGIN        INSERT INTO InsertTest         VALUES(@i,'abc','abc','www','123')        SET @i=@i+1    END        COMMIT TRANSACTION    IF @@ERROR<>0        ROLLBACK TRANSACTION    END

    测试结果如下

    插入100000條數據用時36220ms  

    插入300000條數據用時111826ms  

    插入500000條數據用時165343ms  

    插入10000000條數據用時398216ms

    小结:

    可以看出,时间是随着插入数据条数大致是线性的关系,并且更重要 的,使用了事务后的效率明显要比没有使用要高,

    并且还不是高一点点.

    2,  程序中测试

    2.1 没有使用事务

    代码如下:

    string connectString = @"data source=M204-128/SQL2005;initial catalog=RecruitDB;user id=sa;password=sa";            using (SqlConnection conn = new SqlConnection(connectString))            {                conn.Open();                SqlCommand command = new SqlCommand();                command.Connection = conn;                command.CommandType = CommandType.Text;                try                {                    for (int i = 0; i < 100000; i++)                    {                        command.CommandText = "INSERT INTO InsertTest VALUES(" + i.ToString() + ",'abc','abc','www','123')";                        command.ExecuteNonQuery();                    }                }                catch (Exception ex)                {                }            }

    测试结果如下:

    插入100000條數據用時124765ms

    插入500000條數據用時638984ms

    2.2 使用事务

    代码如下;

    string connectString = @"data source=M204-128/SQL2005;initial catalog=RecruitDB;user id=sa;password=sa";            using (SqlConnection conn = new SqlConnection(connectString))            {                conn.Open();                SqlCommand command = new SqlCommand();                command.Connection = conn;                command.CommandType = CommandType.Text;                SqlTransaction tran = conn.BeginTransaction();                command.Transaction = tran;                try                {                    for (int i = 0; i < 100000; i++)                    {                        command.CommandText = "INSERT INTO InsertTest VALUES(" + i.ToString() + ",'abc','abc','www','123')";                        command.ExecuteNonQuery();                    }                    tran.Commit();                }                catch (Exception ex)                {                    try                    {                        tran.Rollback();                    }                    catch                    {                        throw new Exception("");                    }                }            }

     

    测试结果如下:

    插入100000條數據用時86531ms

    插入500000條數據用時422562ms

    小结:

    这个结果并没有上面的那么样的明显,可能与我写和程序有关,但还是可以看出仍有线性关系,并且,效率还是比没有使用

    事务要高.

    总结:

    从上面的比较中可以看出,使用事务的效率还是比不使用事务的来的好,这里没有测试写入数据发生异常时的回滚带来的

    效率问题,但我不认为这是个问题,因为为什么要用数据库,数据库就是要保证数据的正确性,有事务你发生异常,可以回滚.

    即使在回滚时会有时间消耗.

    (C#几天没练,确实也有一点手生了)

    顺便说一句,在插入大批量数据时,我有更快的方式,不用什么insert这个太慢了.

    ==================================================================

    One day I'll be a hero

    Tag标签: 事务, sql   摘自: http://www.cnblogs.com/ouzi/archive/2008/12/18/1357790.html

    最新回复(0)