论文部分内容阅读
摘要:该文介绍了SQL Server数据库中事务的概念及分类,以及事务处理的必要性。并举例探讨了在SQL Server数据库中如何使用事务,介绍了在Java中利用JDBC进行事务处理的方法。
关键词:数据库;事务处理;数据一致性
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)18-0023-02
随着计算机技术的飞速发展,数据库技术在实际生活中得到了广泛的应用,在使用过程中也从单个用户向网络用户发展,这也使得数据库在安全性管理上显得更为迫切。在数据库操作过程中,有时要执行的一个SQL语句块中,可能为会出现一条或几条语句因意外故障而被中断执行,这样就有要能产生数据库中的数据不一致,解决这个问题的方法就是数据库的事务。
1事务概述
数据库中的事务是一组T-SQL语句组成的集合,这组语句必须作为一个整体来执行,要么成功执行每一条语句,要么一条语句发生意外未被执行,则所有操作复原,数据库恢复到语句执行之前的状态。例如,银行的转账业务,将A账户向B账户转入1000元钱,要完成转账业务,首先将A账户中的余额减少1000元,再将B账户余额增加1000元,这两个操作均成功后才能完成转账业务,否则,数据恢复,取消转账,这就是一个事务。
1.1事务特性
事务作为单个逻辑工作单元,它具有4个特性:
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行;
一致性(Consistency):当事务完成或失败时,数据必须处于一致状态;
隔离性(Isolation):对数据进行的事务操作是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务;
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。
1.2事务类型
sql server数据库中的事务分为三类:显式事务、隐式事务和自动提交事务。
显示事務:用begin tran指定事务的开始,以committran或rollback tran语句结束。这是最常用的事务类型。
隐性事务:通过设置set implicit transactions on语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个T-SQL语句又将启动一个新事务。
自动提交事务:这是SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务,如果成功执行,则自动提交,如果错误,则自动回滚。
2 sql server中的事务处理
sql server中的事务以BEGIN TRANSACTION指定事务的开始,以commit tran或rollback tran语句结束。假如,A账户中有100元,B账户中有100元,现在将A账户的1000元转入B账户,代码如下:
begin tran
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb 1000 where username=′B′
commit tran
因为A账户的余额不足,执行时会出现一个违反check约束的错误信息,但随后又提示“1行受影响”。我们执行select*from account后发现A账户中的余额不足,所以第一行update语句没有执行,但B账户中却增加了1000元钱。这是什么原因呢?原来SQL Server在发生runtime错误时,默认会rollback引起错误的语句,而继续执行后续语句。这显示是不合理的,我们应避免这种情况发生。
2.1利用set xactabort on
在事务处理的最前面加上set xact_abort on语句,当xact_abort选项为on时,SQL Server在遇到错误时会终止执行并rollback整个事务。代码如下:
set xact_abort on
begin tran
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb 1000 where username=′B′
commit tran
此时,会发现当A中余额不足时,转账失败,B账户中的余额也没有增加。
2.2判断每条SQL语句
在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。利用@@ERROR的值进行判断SQL语句是否成功执行,若@@ERROR的值大于0,SQL语句失败,则回滚事务并恢复数据库。代码如下:
begin tran
update account set rmb=rmb-1000 where username=′A′
if@@error>0
rollback tran
update account set rmb=rmb 1000 where username=′B′
if@@error>0
rollback tran
commit tran
2.3利用try…catch异常处理机制
在SQL Server中,可利用try…catch异常处理机制来处理事务,代码如下:
关键词:数据库;事务处理;数据一致性
中图分类号:TP311 文献标识码:A 文章编号:1009-3044(2017)18-0023-02
随着计算机技术的飞速发展,数据库技术在实际生活中得到了广泛的应用,在使用过程中也从单个用户向网络用户发展,这也使得数据库在安全性管理上显得更为迫切。在数据库操作过程中,有时要执行的一个SQL语句块中,可能为会出现一条或几条语句因意外故障而被中断执行,这样就有要能产生数据库中的数据不一致,解决这个问题的方法就是数据库的事务。
1事务概述
数据库中的事务是一组T-SQL语句组成的集合,这组语句必须作为一个整体来执行,要么成功执行每一条语句,要么一条语句发生意外未被执行,则所有操作复原,数据库恢复到语句执行之前的状态。例如,银行的转账业务,将A账户向B账户转入1000元钱,要完成转账业务,首先将A账户中的余额减少1000元,再将B账户余额增加1000元,这两个操作均成功后才能完成转账业务,否则,数据恢复,取消转账,这就是一个事务。
1.1事务特性
事务作为单个逻辑工作单元,它具有4个特性:
原子性(Atomicity):事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行;
一致性(Consistency):当事务完成或失败时,数据必须处于一致状态;
隔离性(Isolation):对数据进行的事务操作是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务;
永久性(Durability):事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。
1.2事务类型
sql server数据库中的事务分为三类:显式事务、隐式事务和自动提交事务。
显示事務:用begin tran指定事务的开始,以committran或rollback tran语句结束。这是最常用的事务类型。
隐性事务:通过设置set implicit transactions on语句,将隐性事务模式设置为打开,下一个语句自动启动一个新事务。当该事务完成时,再下一个T-SQL语句又将启动一个新事务。
自动提交事务:这是SQL Server的默认模式,它将每条单独的T-SQL语句视为一个事务,如果成功执行,则自动提交,如果错误,则自动回滚。
2 sql server中的事务处理
sql server中的事务以BEGIN TRANSACTION指定事务的开始,以commit tran或rollback tran语句结束。假如,A账户中有100元,B账户中有100元,现在将A账户的1000元转入B账户,代码如下:
begin tran
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb 1000 where username=′B′
commit tran
因为A账户的余额不足,执行时会出现一个违反check约束的错误信息,但随后又提示“1行受影响”。我们执行select*from account后发现A账户中的余额不足,所以第一行update语句没有执行,但B账户中却增加了1000元钱。这是什么原因呢?原来SQL Server在发生runtime错误时,默认会rollback引起错误的语句,而继续执行后续语句。这显示是不合理的,我们应避免这种情况发生。
2.1利用set xactabort on
在事务处理的最前面加上set xact_abort on语句,当xact_abort选项为on时,SQL Server在遇到错误时会终止执行并rollback整个事务。代码如下:
set xact_abort on
begin tran
update account set rmb=rmb-1000 where username=′A′
update account set rmb=rmb 1000 where username=′B′
commit tran
此时,会发现当A中余额不足时,转账失败,B账户中的余额也没有增加。
2.2判断每条SQL语句
在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。利用@@ERROR的值进行判断SQL语句是否成功执行,若@@ERROR的值大于0,SQL语句失败,则回滚事务并恢复数据库。代码如下:
begin tran
update account set rmb=rmb-1000 where username=′A′
if@@error>0
rollback tran
update account set rmb=rmb 1000 where username=′B′
if@@error>0
rollback tran
commit tran
2.3利用try…catch异常处理机制
在SQL Server中,可利用try…catch异常处理机制来处理事务,代码如下: