SqlTransaction——事务详解

Posted on 2008-07-20 01:46 停留的风

http://www.cnblogs.com/yank/archive/2008/07/20/1246896.html


事务处理基本原理      
      事务是将一系列操作作为一个单元执行,要么成功,要么失败,回滚到最初状态。在事务处理术语中,事务要么提交,要么中止。若要提交事务,所有参与者都必须保证对数据的任何更改是永久的。不论系统崩溃或是发生其他无法预料的事件,更改都必须是持久的。只要有一个参与者无法做出此保证,整个事务就会失败。事务范围内的所有数据更改将回滚到特定设置点。  

           
      事务将多个操作紧密联系到一起,这样就能保证有联系的两种操作的一致性、以及数据的完整性。举个简单例子:公司的员工信息管理系统,现在要录入数据,员工信息系统假设只有部门、员工信息两张表,其中员工信息表中有标识部门的字段。在你录入信息的时候首先你得录入部门信息,再录入员工信息。具体实现代码: 


         private   static   void  ExecuteSqlTransaction( string  connectionString)
       
{
            
using (SqlConnection connection = new SqlConnection(connectionString))
           
{
                connection.Open();
                SqlCommand command 
= connection.CreateCommand();
                SqlTransaction transaction;  
                transaction 
= connection.BeginTransaction("SampleTransaction");
                command.Connection 
= connection;
                command.Transaction 
= transaction;
                
try
               
{
                    command.CommandText 
=
                        
"Insert into Department (ID, Name) VALUES (1, '工程部')";
                    command.ExecuteNonQuery();
                    command.CommandText 
=
                        
"Insert into Users(ID, Name,DepartmentID) VALUES (1, 'xyz',1)";
                    command.ExecuteNonQuery();
                    transaction.Commit();
                }

                
catch (Exception ex)
               
{
                   transaction.Rollback();
                }

            }

        }

 事务的误区

      事务有很多优点【原理中已经阐述】,由于它的要求比较高,所以注意事务不能滥用,如果用不好就会造成很大的麻烦。

      事务有一个开头和一个结尾,它们指定了事务的边界,事务在其边界之内可以跨越进程和计算机。事务边界内的所有资源都参与同一个事务。要维护事务边界内资源间的一致性,事务必须具备 ACID 属性,即原子性、一致性、隔离性和持续性。这是MSDN的权威说明。

      也许针对一般的小逻辑、小数据事务应用非常的高效、可靠。但如果数据量很大,在单个事务中集合的操作繁多而且复杂,事务的致命伤就会暴露出来。一个事务进行时,必须保证边界资源的原子性、一致性、隔离性和持续性。

      我曾经设计了一个测试用例,测试事务在执行时对资源的利用情况。测试结果很令人惊讶:在事务执行时,独占事务涉及到的数据表,造成其它操作词表的功能,因等待时间过长,而暴跳“获得数据连接超时”的警告。

      具体的测试用例:       


    public class TestTransaction
   
{
       
/// <summary>
        
/// 插入新用户
        
/// </summary>
        
/// <param name="tran"></param>
        
/// <returns></returns>

        private static bool InsertIntoUser(SqlTransaction tran)
       
{
            
string strSql = @"INSERT INTO [T_User]
                                           ([F_Name])
                                     VALUES
                                           (@F_Name)
";
            SqlParameter[] Params 
=new SqlParameter("@F_Name", SqlDbType.VarChar, 20) };
            Params[
0].Value="Test1001";
            
int count= SqlHelper.ExecuteNonQuery(strSql,Params,tran);
            
if (count > 0)
           
{
                
return true;
            }

            
else
           
{
                
return false;
            }

        }

       
/// <summary>
        
/// 插入title
        
/// </summary>
        
/// <returns></returns>

        private static bool InsertIntoTitle(SqlTransaction tran)
       
{
            
string strSql = @"INSERT INTO [T_User_Title]
                                       ([F_TitleName],
                                        [F_Remark],
                                        [F_Status],
                                        [F_EditTime])
                                 VALUES
                                       (@F_TitleName,
                                        @F_Remark,
                                        @F_Status,
                                        @F_EditTime)
";
            SqlParameter[] Params 
= 
                
new SqlParameter("@F_TitleName",SqlDbType.VarChar, 50), 
                
new SqlParameter("@F_Remark", SqlDbType.VarChar, 200), 
                
new SqlParameter("@F_Status", SqlDbType.Int, 1), 
                
new SqlParameter("@F_EditTime", SqlDbType.DateTime, 8) }
;
            Params[
0].Value = "TestUser1001";
            Params[
1].Value = "这是第一次测试";
            Params[
2].Value = 1;
            Params[
3].Value = DateTime.Now;
            
int count = SqlHelper.ExecuteNonQuery(strSql,Params,tran);
            
if (count > 0)
           
{
                
return true;
            }

            
else
           
{
                
return false;
            }

        }

       
/// <summary>
        
/// 检测Transaction
        
/// </summary>
        
/// <returns></returns>

        public static bool InsertWithTran()
       
{
            
bool success = false;
            
string connectionString=System.Configuration.ConfigurationSettings.AppSettings["SqlConStr"].ToString();
            
using (SqlConnection con = new SqlConnection(connectionString))
           
{
                con.Open();
                SqlTransaction tran 
= con.BeginTransaction();
                
try
               
{  
                    
if (tran == null)
                   
{
                        
throw new Exception("Transaction is null");
                    }

                    
if (InsertIntoUser(tran))
                   
{
                        
if (InsertIntoTitle(tran))
                       
{
                            tran.Commit();
                            success 
= true;
                        }

                    }

                }

                
catch
               
{
                    tran.Rollback();
                    success 
= false;
                }

                
finally
               
{
                    tran.Dispose();
                    con.Close();
                }

            }

            
return success;

        }

    }

       


    protected void Button1_Click(object sender, EventArgs e)
   
{
        
bool success = TestTransaction.InsertWithTran();
        
if (success)
       
{
            Bmc.CLUtility.ShowMessage(
this.Page, "插入成功");            
        }

        
else
       
{
            Bmc.CLUtility.ShowMessage(
this.Page, "插入失败");
        }

    }

 


<1>运行程序
<2>将运行的地址,发给在同一个网段的同事,通过适当修改也能够看到你运行的程序
<3>两人都点击按钮,并查询数据库,看事务是否正确执行
<4>在事务中间创建断点,主机点击按钮,并在断点处中断执行一段时间
<5>然后你们连接到数据库,分别查询表的数据,发现不能执行查询操作。
<6>在同事机器点击按钮,查询windows日志,发现了一些警告
这就证明了,事务在执行过程中,独占资源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/350735.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

sql server 2005 T-SQL BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)

指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。 Transact-SQL 语法约定 语法 BEGIN DISTRIBUTED { TRAN | TRANSACTION } [ transaction_name | tran_name_variable ] [ ; ] 参数 transaction_name 用户定义的事务名&#x…

编写Transact-SQL语句

适用于&#xff1a; SQL Server Azure SQL数据库Azure Synapse Analytics&#xff08;SQL DW&#xff09;并行数据仓库 欢迎使用《编写Transact-SQL语句》教程。本教程适用于刚编写SQL语句的用户。通过检查一些有关创建表和插入数据的基本语句&#xff0c;它将帮助新用户开始…

SQL transaction事物以及各种锁、waitfor、脏读、幻读

事务定义 数据库事务(Database Transaction)&#xff0c;是指作为单个逻辑工作单元执行的一系列操作&#xff0c;要么完全地执行&#xff0c;要么完全地不执行。 简单的说&#xff1a;事务就是将一堆的SQL语句(通常是增删改操作)绑定在一起执行&#xff0c;要么都执行成功&am…

SQL 之 事务(Transaction)

SQL 之 事务 一、什么是事务&#xff1f;二、事务的四大特性(ACID)1. 原子性(Atomicity)2. 一致性(Consistency)3. 隔离性(Isolation)4. 持久性(Durability) 三、并发事务带来的问题1. 脏读(Dirty read)2. 修改丢失(Lost to modify)3. 不可重复读(Unrepeatableread)4. 幻读(Pha…

004-从零搭建微服务-认证中心(四)

写在最前 如果这个项目让你有所收获&#xff0c;记得 Star 关注哦&#xff0c;这对我是非常不错的鼓励与支持。 源码地址&#xff1a;https://gitee.com/csps/mingyue 文档地址&#xff1a;https://gitee.com/csps/mingyue/wikis 搭建前端框架 感谢开源项目【vue-next-adm…

5年软件测试工程师工作感悟,谁还能“点点点”一辈子呢?

经常都有人问我软件测试前景怎么样&#xff0c;每年也都帮助很多朋友做职业分析和学习规划&#xff0c;也很欣慰能够通过自己的努力帮到一些人进入到大厂。 2023年软件测试行业的发展现状以及未来的前景趋势 最近很多测试人在找工作的时候&#xff0c;明显的会发现功能测试很…

【深入浅出 Spring Security(六)】一文搞懂密码的加密和比对

Spring Security 中的密码加密 一、PasswordEncoder 详解常见的实现类&#xff08;了解&#xff09;DelegatingPasswordEncoder源码分析DelegatingPasswordEncoder 在哪实例化的&#xff1f; 二、自定义加密自定义方式一&#xff1a;使用{id}的形式自定义方式二&#xff1a;向S…

花3个月面过阿里测开岗,拿个25K不过分吧?

计算机专业&#xff0c;代码能力一般&#xff0c;之前有过两段实习以及一个学校项目经历。第一份实习是大二暑期在深圳的一家互联网公司做前端开发&#xff0c;第二份实习由于大三暑假回国的时间比较短&#xff08;小于两个月&#xff09;&#xff0c;于是找的实习是在一家初创…

Excel集成GPT,惊呆我了

Excel&GPT 从最开始的GPT对话&#xff0c;到后面的Office集成GPT进行内测&#xff0c;用GPT实现写Word、做Excel、做PPT&#xff08;别着急&#xff0c;后面我会分享AIPPT&#xff09;已经不再是设想&#xff0c;而在逐步演变成真的&#xff01; 当然&#xff0c;目前国内…

impala内存超限

目录 一、背景 二、报错内容 三、解决办法 1.调参 2.简单粗暴 一、背景 impala shell执行SQL语句时报错 二、报错内容 Memory limit exceeded: Could not allocate memory while trying to increase reservation. 三、解决办法 1.调参 mem_limit参数&#xff1a;&…

2023,智能硬件的AIGC“又一春”

​ 文|智能相对论 作者|佘凯文 消费电子产品风光不再&#xff0c;特别是自去年以来&#xff0c;电子消费市场经历了一整年的寒潮袭击&#xff0c;智能手机等产品达到10年消费谷底&#xff0c;PC出货量整体下降16%&#xff0c;不仅如此&#xff0c;包括平板、可穿戴设备也一改…

Java读取U盘的PID、VID、SN

Java是不能像C、C那样直接读取U盘的PID、VID、SN信息的&#xff0c;但是我们可以换一个思路&#xff0c;让Java从注册表中读取信息。 这是U盘信息在注册表中的位置&#xff1a;HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\USBSTOR\\Enum import java.io.Buffer…

02_搭建项目(servlet+java bean+jsp的商城教程)

搭建项目 数据库和表项目包结构jar包工具类和配置文件前台文件&#xff08;html,css,js,img等静态资源&#xff09; 1&#xff09;数据库和表 新建数据库store&#xff0c;按照上一节分析的实体结构创建数据表并插入数据&#xff1a; user表&#xff1a; CREATE TABLE user …

org.apache.jasper.JasperException: Unable to compile class for JSP

博主最近在将一个项目导入一台新机器的时候&#xff0c;出现了如题所述的异常&#xff0c;以前从没有出现过&#xff0c;我跟往常一样到网上寻求帮助&#xff0c;网上的解决方案多如牛毛&#xff0c;什么Tomcat版本与IDE不匹配、jar包冲突、xml文件错误、路径错误等等。在一一尝…

Java毕业设计:基于jsp+mysql+Spring+SpringMVC+mybatis的网络硬硬盘系統网站

项目介绍 网盘&#xff0c;又称网络U盘、网络硬盘&#xff0c;是一些网络公司推出的在线存储服务。向用户提供文件的存储、访问、备份、共享等文件管理功能&#xff0c;使用起来十分方便。不花钱的移动硬盘。用户可以把网盘看成一个放在网络上的硬盘或U盘&#xff0c;不管你是…

基于jsp+mysql+ssm网络硬硬盘系統网站-计算机毕业设计

项目介绍 网盘&#xff0c;又称网络U盘、网络硬盘&#xff0c;是一些网络公司推出的在线存储服务。向用户提供文件的存储、访问、备份、共享等文件管理功能&#xff0c;使用起来十分方便。不花钱的移动硬盘。用户可以把网盘看成一个放在网络上的硬盘或U盘&#xff0c;不管你是…

supermicro服务器通过U盘安装部署vmware vsphere并使用

制作U盘安装镜像 前提准备&#xff1a; 镜像&#xff1a; https://my.vmware.com/en/web/vmware/evalcenter?pfree-esxi6 直接到官网下载 VMware vSphere Hypervisor 6.7&#xff0c;不过要先注册才能用。另外这个是免费版的&#xff0c;有验证码&#xff0c;可以长期使用…

linux redhat9 u盘,LINUX(redhat9)下安装JDK(虚拟机VM上挂载U盘)

LINUX(redhat9)下安装JDK(虚拟机VM上挂载U盘) 2010-07-11 21:24 1.首先&#xff0c;我们去http://www.doczj.com/doc/11c2bbedb8f67c1cfad6b82a.html去下载JDK1.6.0 for LINUX的rpm. (http://www.doczj.com/doc/11c2bbedb8f67c1cfad6b82a.html/javase/downloads/index.jsp) 应该…

Ubuntu的JSP服务器安装

2019独角兽企业重金招聘Python工程师标准>>> 一、man中文版 1、安装&#xff1a;sudo apt-get install manpages-zh 2、把中文man包转换成utf8格式的 新建一个脚本文件gedit t.sh把下面内容添加进去#!/bin/bash cd /usr/share/man/zh_CN/ for k in *do cd $k for i …

JSP环境配置全解!

实现JSP文件环境配置除了MyEclipse外&#xff0c;最通俗的还是jdk加Tomcat。 今天上午刚把期末考试搞定&#xff0c;就紧迫不及待的在李超和超哥的指导下完成了JSP环境配置。以后要专心搞JAVA了&#xff0c;呵呵。。。 为了让我以后可以快速的独立配置环境…