数据库事务控制

事务(Transaction)是用来设置将连续多个的程序操作必须全部执行成功,否则必须立即答复到未执行任何程序操作的状态

事务的四大属性 事务中共有四个属性,这四个属性就称为ACID。ACID指的是:不可部分完成性(Atomicity)一致性(Consistency)隔离性(Isolation)与耐久性(Durability)等四种属性

首先建立一个演示数据库

--建库
IF EXISTS (SELECT name FROM sys.databases WHERE name = N‘TransTestDb‘)
    drop database [TransTestDb]

CREATE DATABASE [TransTestDb];

--建表
use [TransTestDb]
go
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N‘[dbo].[TransTestTable]‘) AND type in (N‘U‘))
    drop table [TransTestTable]

CREATE TABLE [dbo].[TransTestTable](Id int, [Name] varchar(16));

--初始值
use [TransTestDb]
go
insert into [TransTestTable]
    select 1,‘a‘ union
    select 2,‘b‘ union
    select 3,‘c‘;

(1)直接在SQL语句中实现。

begin try
    begin tran
        insert into dbo.TransTestTable values (66,‘66‘);
        update dbo.TransTestTable set [Name] = ‘77‘ where [Id] = 66;
        --RAISERROR (‘Error raised in TRY block.‘,16,1);
    commit tran
end try
begin catch
    rollback tran
end catch

(2)利用对象SqlTransaction实现,一般通过SqlConnection 对象的BeginTransaction()方法创建,当然也可以先创建SqlTransaction事务对象,然后设置Connection属性。

 public static int ExecuteSqlTran(List<String> SQLStringList)
        {
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                SqlTransaction tx = conn.BeginTransaction();
                cmd.Transaction = tx;
                try
                {
                    int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
                    return count;
                }
                catch
                {
                    tx.Rollback();
                    return 0;
                }
            }
        }

SqlTransaction 对象有Commit(),Rollback()Rollback(string) ,Save(string) 几个常用的方法。

Commit():指示事务已经执行完成,同sql语句中执行commit指令。

Rollback():从挂起状态回滚事务。

Save(string),Rollback(string) :这两个方法一般配套使用,前者表示在事务的过程中创建一个保存点;后者表示回滚到指定的保存点。

(3)TransactionScope对象实现事务控制,此对象有一个Complete方法指示事务完成。没有其他的事务操作函数,一般放在using指令后,如果其中发生异常或者错误,都直接回滚。

 public static int ExecuteSqlTran(List<String> SQLStringList) {
   using (TransactionScope scope = new TransactionScope())
   {
       SqlConnection conn = new SqlConnection(connectionString)
       sqlConn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                int count = 0;
                    for (int n = 0; n < SQLStringList.Count; n++)
                    {
                        string strsql = SQLStringList[n];
                        if (strsql.Trim().Length > 1)
                        {
                            cmd.CommandText = strsql;
                            count += cmd.ExecuteNonQuery();
                        }
                    }
                    tx.Commit();
       sqlConn.Close();
       scope.Complete();
     }

  }
时间: 2024-12-27 14:51:42

数据库事务控制的相关文章

【MySQL】数据库事务深入分析

一.前言 只有InnoDB引擎支持事务,下边的内容均以InnoDB引擎为默认条件 二.常见的并发问题 1.脏读 一个事务读取了另一个事务未提交的数据 2.不可重复读 一个事务对同一数据的读取结果前后不一致.两次读取中间被其他事务修改了 3.幻读 幻读是指事务读取某个范围的数据时,因为其他事务的操作导致前后两次读取的结果不一致.幻读和不可重复读的区别在于,不可重复读是针对确定的某一行数据而言,而幻读是针对不确定的多行数据.因而幻读通常出现在带有查询条件的范围查询中 三.事务隔离级别 1.读未提交(

springmvc 事务控制与数据库隔离级别

springmvc 事物传播与数据库隔离控制 http://www.cnblogs.com/yangy608/archive/2011/06/29/2093478.html 一.Propagation (事务的传播属性) Propagation : key属性确定代理应该给哪个方法增加事务行为.这样的属性最重要的部份是传播行为.有以下选项可供使用:PROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务.这是最常见的选择.PROPAGATION_SUPPORTS

数据库并发事务控制四:postgresql数据库的锁机制二:表锁

在博文<数据库并发事务控制四:postgresql数据库的锁机制 > http://blog.csdn.net/beiigang/article/details/43302947 中后面提到: 常规锁机制可以参考pg的官方手册,章节和内容见下面 13.3. Explicit Locking http://www.postgresql.org/docs/9.4/static/explicit-locking.html 这节分为:表锁.行锁.页锁.死锁.Advisory锁(这个名字怎么翻译好???

PHP mysqli 扩展库(面向对象/数据库操作封装/事务控制/预编译)

1.和mysql扩展库的区别: (1   安全性.稳定性更高 (2  提供了面向对象和面向过程两种风格 2.php.ini  中的  extension=php_mysqli.dll 解除封印 3.面向对象:查询列表 1 <?php 2 3 //mysqli 操作数据(面向对象风格) 4 5 #1.创建Mysql对象 6 7 $mysqli=new MySQLi("127.0.0.1","root","daomul","test&

数据库 之 事务控制和隔离级别

1  概述 事务是指一组原子性的SQL查询.或者是一个或多个SQL语句组成的独立工作单元:MyISAM不流行的原因很大是因为其不支持事务的处理功能. 2  事务日志 事务日志定义属性,有些参数可以运行时修改,写入在配置段里,事务日志相当于是中间的辅助功能,而且很关键. 事务日志表示把操作过程一笔一笔记录下来.如某个线程要对某个行操作,数据库会先保留老版本于事务日志中,对文件的写入,新版本的内容是先写入到日志里,提交前,数据在日志文件中,而不是在数据文件中,提交操作执行后,才将新旧版本的日志清除.

数据库-事务和锁

事务 所谓事务是用户定义的一个数据库操作系列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位.例如在关系数据库中,一个事务可以是一条sql语句.一组sql语句或整个程序. 给个栗子: 小IT在网上购物,其付款过程至少包括以下几步数据库操作: 更新客户所购商品的库存信息: 生成订单并且保存到数据库: 更新用户相关信息,例如购物数量等: 正常情况下,操作顺利进行,最终交易成功,那么与交易相关的所有数据库信息也成功更新.但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存

Spring 的官方的事务控制

Spring 官方版的事务控制 什么是事务? 事务是数据库(RDB)保证业务操作完整性的一种机制(强一致性) 事务在那里控制 业务层控制(Service 或Biz 或Business) 如何控制事务(不同的底层不同的控制) 如果是JDBC:----Connnection Connection.setAutoCommit(false) Connection.commit() Connection.rollback() 如果是Hibernate ------Session ---SessionFac

[数据库事务与锁]详解三: 深入分析事务的隔离级别

注明: 本文转载自http://www.hollischuang.com/archives/943 本文详细介绍四种事务隔离级别,并通过举例的方式说明不同的级别能解决什么样的读现象.并且介绍了在关系型数据库中不同的隔离级别的实现原理. 在DBMS中,事务保证了一个操作序列可以全部都执行或者全部都不执行(原子性),从一个状态转变到另外一个状态(一致性).由于事务满足久性.所以一旦事务被提交之后,数据就能够被持久化下来,又因为事务是满足隔离性的,所以,当多个事务同时处理同一个数据的时候,多个事务直接

[数据库事务与锁]详解七: 深入理解乐观锁与悲观锁

注明: 本文转载自http://www.hollischuang.com/archives/934 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 乐观并发控制(乐观锁)和悲观并发控制(悲观锁)是并发控制主要采用的技术手段. 无论是悲观锁还是乐观锁,都是人们定义出来的概念,可以认为是一种思想.其实不仅仅是关系型数据库系统中有乐观锁和悲观锁的概念,像memcache.hibernate.