sql-事务

来源:互联网 发布:一个淘宝店铺卖多少钱 编辑:程序博客网 时间:2024/04/26 03:41

      数据库在执行DML操作时,是通过事务的方式进行管理的。事务是由一组DML操作组成的单元,用于保证数据的一致性;在一整个事务中的DML操作要么一起成功,要么一起被放弃。如果用户主动提交或撤销,称作显式结束事务;被动提交或撤销,称作隐式结束事务。

   


(1):事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。


(2):事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。
COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。
ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。
(3):事务运行的三种模式:
A:自动提交事务
每条单独的语句都是一个事务。每个语句后都隐含一个COMMIT。
B:显式事务
以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。
C:隐性事务
在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。
(4):事务的特性(ACID特性)
A:原子性(Atomicity)
事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。
B:一致性(Consistency)
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
C:隔离性(Isolation)
一个事务的执行不能被其他事务干扰。
D:持续性/永久性(Durability)
一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。

注:事务是恢复和并发控制的基本单位。

    事务 重要!! 类似线程中的 锁              保证数据合理性跟并发处理状态              1.避免数据处于一种不合理的状态                  转账 A减少 B增加  AB 就数据一个事务同时完成或不做              2. 利用事务实现多个用户对共享资源的同时访问                  多个用户同时访问操作 如何实现正确性              事务和线程的关系                  事务也是通过锁来实现并发问题                  线程同步也是通过锁来解决的 synchronized              事务跟第三方插件的关系                  直接使用数据库难度太大 很多人都用数据库辅助插件完成访问                  我们普通人把数据库事务当工具用就好,而第三方插件需要考虑这种东西。              T-SQL                   开始事务 begin transaction                  提交事务 commit transaction                  回滚(撤销)事务 rollback transaction                      开始事务                      try {..... throw (抛出异常)}                      catch{撤销事务}                      提交事务                  事务特性 ACID属性                      1.原子性  事务是一个完整操作,不会执行一半不执行了                      2.一致性  事务执行完毕后数据处于一致状态  要么开始 要么结束  不会中间                      3.隔离性  当前事务跟其他没完成的事务是隔离的 在不同隔离级别下 事务的读取 可以得到不同结果                      4.持久性  事务完成后 对数据库修改完成  日志也要有效保存。              SQL-SQL-server 例子:                  create database Test                  use Test                  create table bank                  (                  customerEname nvarchar(200),                  currentMoney money                   )                  insert into bank values ('张三', 1000)                  insert into bank values ('李四', 1)                  --alter 修改 表                  alter table bank add constraint check_currentMoney check(currentMoney>=1)                    update bank set currentMoney=currentMoney-1000 where customerEname='张三'                  update bank set currentMoney=currentMoney+1000 where customerEname='李四'                    begin transaction                  declare @errorSum int                  set @errorSum = 0                  update bank set currentMoney=currentMoney-1000                   where customerEname='张三'                  set @errorSum = @errorSum + @@error --(上面语句执行后自动把能否执行放入@@error中)                  update bank set currentMoney=currentMoney+1000                   where customerEname='李四'                  set @errorSum = @errorSum + @@error                  if (@errorSum <> 0)                      begin                          print '转账失败'                          rollback transaction                      end                  else                      begin                      print '转账成功'                      commit transaction                  end  


数据库在执行DML操作时,是通过事务的方式进行管理的。事务是由一组DML操作组成的单元,用于保证数据的一致性;在一整个事务中的DML操作要么一起成功,要么一起被放弃。如果用户主动提交或撤销,称作显式结束事务;被动提交或撤销,称作隐式结束事务。