sql事务处理
A. 在sql中怎样使用事务
SQL Server 需要显示的定义 开始一个事务.
BEGIN TRANSACTION;
例如:
1> BEGIN TRY
2> -- SQL Server 需要显示的定义 开始一个事务.
3> BEGIN TRANSACTION;
4> -- 插入2条同样的数据,使主键重复,引发错误后回滚事务.
5> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
6> INSERT INTO test_main(id, value) VALUES (4, 'FOUR');
7> -- 执行成功后,需要提交事务.
8> COMMIT;
9> END TRY
10> BEGIN CATCH
11> PRINT('Main.错误代码 = ' + STR(ERROR_NUMBER()));
12> PRINT('Main.错误严重级别 = ' + STR(ERROR_SEVERITY()));
13> PRINT('Main.错误状态代码 = ' + STR(ERROR_STATE()));
14> PRINT('Main.错误信息 = ' + ERROR_MESSAGE());
15> -- 回滚事务
16> ROLLBACK;
17> END CATCH
18>
19> go
B. 在VB中,怎样对SQL进行事务处理
事务处理是在数据处理时经常遇到的问题,经常用到的方法有以下3种总结整理如下:
方法1:直接写入到sql中
在存储过程中使用BEGINTRANS,COMMITTRANS,ROLLBACKTRANS实现
begintrans
declare@orderDetailsErrorint,@procuntErrorint
deletefrom[orderdetails]whereproctid=42
select@orderDetailsError=@@error
deletefromproctswhereproctid=42
select@procuntError=@@error
if(@orderDetailsError=0and@procuntError=0)
COMMITTRANS
else
ROLLBACKTRANS
优点:
所有事务逻辑包含在一个单独的调用中
拥有运行一个事务的最佳性能
独立于应用程序
限制:
事务上下文仅存在于数据库调用中
数据库代码与数据库系统有关
方法2:使用ADO.NET实现
使用ADO.NET实现,使用这种方式的优点是可以在中间层来管理事务,当然你也可以选择在数据层来实现。
SqlConnection和OleDbConnection对象有一个BeginTransaction方法,它可以返回SqlTransaction
或者OleDbTransaction对象。而且这个对象有Commit和Rollback方法来管理事务
SqlConnectionsqlConnection=newSqlConnection("workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False");
sqlConnection.Open();
SqlTransactionmyTrans=sqlConnection.BeginTransaction();
SqlCommandsqlInsertCommand=newSqlCommand();
sqlInsertCommand.Connection=sqlConnection
sqlInsertCommand.Transaction=myTrans;
try{
sqlInsertCommand.CommandText="insertintotbTree(Context,ParentID)values('北京',1)";
sqlInsertCommand.ExecuteNonQuery();
sqlInsertCommand.CommandText="insertintotbTree(Context,ParentID)values('上海',1)";
sqlInsertCommand.ExecuteNonQuery();
myTrans.Commit();
}catch(Exceptionex)
{
myTrans.Rollback();
}
finally
{
sqlConnection.Close();
}
优点:
简单性
和数据据事务差不多的快
独立于数据库,不同数据库的专有代码被隐藏了
缺点:
事务不能跨越多个数据库连接
事务执行在数据库连接层上,所以需要在事务过程中维护一个数据库连接
ADO.NET分布事务也可以跨越多个数据库,但是其中一个SQLSERVER数据库的话,通过用SQLSERVER连接服务器连接到别的数据库,但是如果是在DB2和Orcal之间就不可以。
以上两种事务是经常用到的事务处理方法。
方法3COM+事务(分布式事务)
.NETFramework依靠MTS/COM+服务来支持自动事务。COM+使用(DTC)作为事务管理器和事务协调器在分布式环境中运行事务。
这样可使.NET应用程序运行跨多个资源结合不同操作(例如,将定单插入SQLServer数据库、将消息写入Microsoft消息队列(MSMQ)队列、以及从Oracle数据库检索数据)
的事务。
COM+事务处理的类必须继承System.EnterpriseServices.ServicedComponent,其实webservice就是继承System.EnterpriseServices.ServicedComponent,所以webservice也支持
COM+事务。
定义一个COM+事务处理的类
[Transaction(TransactionOption.Required)]
publicclassDataAccess:System.EnterpriseServices.ServicedComponent
{
}
TransactionOption枚举类型支持5个COM+值(Disabled,NotSupported,Required,RequiresNew,Supported)
Disabled忽略当前上下文中的任何事务。
NotSupported使用非受控事务在上下文中创建组件。
Required如果事务存在则共享事务,并且如有必要则创建新事务。
RequiresNew使用新事务创建组件,而与当前上下文的状态无关。
Supported如果事务存在,则共享该事务。
一般来说COM+中的组件需要Required或Supported。当组件用于记录或查帐时RequiresNew很有用,因为组件应该与活动中其他事务处理的提交或回滚隔离开来。
派生类可以重载基类的任意属性。如DataAccess选用Required,派生类仍然可以重载并指定RequiresNew或其他值。
COM+事务有手动处理和自动处理,自动处理就是在所需要自动处理的方法前加上[AutoComplete],根据方法的正常或抛出异常决定提交或回滚。
手动处理就是调用ContextUtil类中EnableCommit,SetComplete,SetAbort方法。
publicstringtestTransaction()
{
try
{
ContextUtil.EnableCommit();
InsertARecord1();
InsertARecord2();
ContextUtil.SetComplete();
return"succeed!";
}
catch(Exceptionex)
{
ContextUtil.SetAbort();
return"failed!";
}
}
publicvoidInsertARecord1()
{
stringstrconn="workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False";
SqlConnectionconn=newSqlConnection(strconn);
conn.Open();
SqlCommandcommand=newSqlCommand("insertintotbTree(Context,ParentID)values('北京',1)",conn);
command.ExecuteNonQuery();
conn.Close();
}
publicvoidInsertARecord2()
{
stringstrconn="workstationid=WEIXIAOPING;packetsize=4096;userid=sa;initialcatalog=Northwind;persistsecurityinfo=False";
SqlConnectionconn=newSqlConnection(strconn);
conn.Open();
SqlCommandcommand=newSqlCommand("insertintotbTree(Context,ParentID)values('上海',1)",conn);
command.ExecuteNonQuery();
conn.Close();
}
在需要事务跨MSMQ和其他可识别事务的资源(例如,SQLServer数据库)运行的系统中,只能使用DTC或COM+事务,除此之外没有其他选择。DTC协调参与分布式事务的所有资源管理器, 也管理与事务相关的操作。
这种做法的缺点是,由于存在DTC和COM互操作性开销,导致性能降低。
COM+事务处理的类必须强命名。
C. sql中什么是事务啊
事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。
事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。
(3)sql事务处理扩展阅读
事务类型
(1)手动事务
手动事务允许显式处理若干过程,这些过程包括:开始事务、控制事务边界内的每个连接和资源登记、确定事务结果(提交或中止)以及结束事务。
(2)自动事务
.NET 页、XML Web services方法或 .NET Framework 类一旦被标记为参与事务,它们将自动在事务范围内执行。您可以通过在页、XML Web services 方法或类中设置一个事务属性值来控制对象的事务行为。
D. 如何在VFP里写SQL Server的事务处理
*********************************************************************************
Transactions_error=.f.&&事务过程失败标志
=SQLSETPROP(myconnect,‘Transactions’,2)&&启动手动事务处理
**————————————————————
TEXTTOsql_tmp1NOSHOW
INSERTINTOamt_bum(id_bum,bum_bh)
values(?id_bum,?bum_bh)
IF(SELECTcount(1)FROMamt_bumWHEREbum_bh=?bum_bh)>1
SELECT9asok
ELSE
SELECT1asok
ENDTEXT
**————————————-
IFTransactions_error=.F.
SELECTMy_mt_bum_fm_bum
IFsqlexec(myconnect,sql_tmp1,’My_mt_bum_fm_my_int_tm’)<=0
WAITWINDOW"新增部门资料失败!"NOWAIT
Transactions_error=.t.
ELSE
SELECTMy_mt_bum_fm_my_int_tm
DOcase
CASEok=1
**正常
CASEok=9
MESSAGEBOX("此部门有重复不允许存盘!","")
Transactions_error=.t.
ENDCASE
use
ENDIF
ENDIF
**————————————-
IFTransactions_error=.t.
=SQLROLLBACK(myconnect)
ELSE
=SQLCOMMIT(myconnect)
WAITWINDOW"数据存盘成功!"NOWAIT
ENDIF
=SQLSETPROP(myconnect,‘Transactions’,1)&&恢复自动事务处理
*********************************************************************************
E. 如何清空 SQL 服务器事务处理日志
这里的事务日志清理是指截断事务日志并释放空间。
操作方法:
1、通过备份事务日志进行截断
备份时的默认选项就是Truncate the transaction log(截断事务日志),备份完成后,事务日志就会自动被截断,但这时你查看日志文件的大小还是和原来一样。所以,需要通过第二步释放日志文件占用的空间。
2、通过收缩日志文件释放日志文件占用的空间
将恢复模式由完整(Full)改为简单(Simple)
收缩(Shrink)日志文件
将恢复模式由简单(Simple)改为完整(Full)
3、收缩数据库(Shrink database)
F. SQL server中的事务与批处理语句有什么区别
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)所应该具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability).这是可靠数据库所应具备的几个特性.下面针对这几个特性进行逐个讲解.
原子性意味着数据库中的事务执行是作为原子。即不可再分,整个语句要么执行,要么不执行。 在SQL SERVER中,每一个单独的语句都可以看作是默认包含在一个事务之中:
对于用户来说,要用事务实现的自定义原子性往往是和业务相关的,比如银行转账,从A账户减去100,在B账户增加100,如果这两个语句不能保证原子性的话,比如从A账户减去100后,服务器断电,而在B账户中却没有增加100.虽然这种情况会让银行很开心,但作为开发人员的你可不希望这种结果.而默认事务中,即使出错了也不会整个事务进行回滚。而是失败的语句抛出异常,而正确的语句成功执行。这样会破坏原子性。所以SQL SERVER给予了一些选项来保证事务的原子性.
数据库中实现事务性有三种方法,这里只介绍前两种方法:
1. 在事务语句最前面加上set xact_abort on
如:
create procere SP_Trans_Account @UserID int,@DestID int,@imoney bigint
as
begin
set xact_abort on
begin tran
update TUserInfo set WalletMoney=WalletMoney+@imoney where UserID=@DestID
update TUserInfo set WalletMoney=WalletMoney-@imoney where UserID=@UserID
commit tran
end当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。
2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。
create procere SP_Trans_Account @UserID int,@DestID int,@imoney bigint
begin tran
update TUserInfo set WalletMoney=WalletMoney+@imoney where UserID=@DestID
update TUserInfo set WalletMoney=WalletMoney-@imoney where UserID=@UserID
if @@error<>0 --如果不为零,表示事务发生错误,则回滚事务
begin
rollback tran
end
else
begin
commit tran --提交事务
end
原文链接:网页链接
G. sql的事务问题
如果没有猜错,楼主应该是在执行COMMIT TRANSACTION tran3 后,直接在当前的查询界面查看的表里的数据吧?对于当前会话,即使你没有执行COMMIT,所有数据都会在当前的会话里发生变化,你可以不执行COMMIT TRANSACTION tran3,直接查看表里的数据,你会看到即使没有提交任何事物,表里的数据还是发生变化了。如果你再打开一个查询窗口,你会发现直接从testtran 表里select数据是会一直等待的,因为其它会话(也就是开始你执行begin tran那个会话)有事务没有提交,表是锁定的。事务是用来保证多个会话之间不会应为事务不一致而产生脏数据。对同一会话,是看不出效果的。
H. SQL 对事务的管理包括哪几方面
首先你得了解什么是事务?
第一点:事务是一种机制.是一个操作序列,它包含一组数据库操作命令,并且所有的命令作为一个整体一起向系统提交或撤消,即这一组数据库命令要么都执行,要么都不执行.
第二点:你要了解事务的4个属性,即ACID
原子性:事务是一个完整的操作
一致性:当事务完成时,数据是必须处于一致状态
隔离性:对数据进修改的所有并发事务是彼此隔离的.
持久性:事务完成后,它对于系统的影响是永久的.
而你问如何管理事务,主要由下列语句
1.开始事务:begin tran
2.提交事务:commit tran
3.回滚事务:rollback tran
至于如何运用这些语句,其实很简单,你在编写事务SQL语句时,一定会存在if语句,也就是说,你认为对的,是正确的,就写上提交事务,你认为错了就回滚事务,但这些必须是语句最开头写上开始事务!