12.1. 事务声明
BEGIN TRANSACTION
UPDATE INVENTORY
SET Lease = 0
WHERE intLeaseScheduleId = @intLeaseScheduleId
UPDATE LeaseSchedule
SET PeriodicTotalAmount = 0
WHERE ScheduleId = @intLeaseScheduleId
IF @@ERROR <>0
BEGIN
COMMIT TRANSACTION
Return 0
END
ELSE
BEGIN
PRINT '无法保存到数据库'
ROLLBACK TRANSACTION
END
12.2. 事务保存点
BEGIN TRANSACTION
INSERT INTO trans_table(1,'insert 1')
INSERT INTO trans_table(2,'insert 2')
SAVE TRANSACTION save1 --存储点
DELETE FROM trans_table WHERE row_number = 2
SAVE TRANSACTION save2 --存储点
ROLLBACK TRANSACTION save2 --回滚到保存点
UPDATE trans_table SET describe = 'row1 after 2'
DELETE FROM trans_table WHERE row_number = 4
COMMIT TRANSACTION
12.3. 事务并发控制
? 并发操作问题
1、 数据丢失
两个用户共享一个账户(5000元)。
当A从账户中取1000元,在未提交事务时,B从账户中提取2000元,而后A提交事务,然后B提交事务时会发生账户数据丢失问题使账户保存金额为3000元,而不是2000元。
2、 未提交的事务读取-错读
两个用户共享一个账户(5000元)
A购物花费3500元(事务更该,但尚未提交),这时B结账花费2500元,这时会因为金额不足取消操作。但后来A改变主意取消订单,这时账户恢复到5000元的水平,但是B由于读取了用户A中间修改的数据结果,导致错读。
3、 不一致读 – 不可重复读
在一段时间内,反复读取某些数据库表的数据,而结果应该总是保持一致。但是有时在反复读取的过程中,有其他用户的操作,用户会受到干扰,返回两个不同的结果,就发生不可重复读。
4、 幻影读 – 假读
事务A读取某表,但是有可能在事务A读取第一次后,在读取第二次之前,事务B想表中插入了新行或者删除了某行,则两次读取的结果就不一样。当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,发生幻读现象。
? 事务隔离级别
1、 READ UNCOMMITTED未提交的读取
允许读取已经被其他用户修改但尚未提交确定的数据,使用READ UNCOMMITTED隔离级别时以上四种并发问题都可能发生,但好处是所处理的语句可避免并发控制带来的开销。
2、 READ COMMITTED 提交读取
通过隐藏未提交的变化解决读取脏数据的并发事务问题,但不能防止不可重复读和幻读问题。
3、 REPEATABLE READ 可重复读取
用SELECT命令读取数据时DBMS将实施锁定,可避免重读读取问题。
4、 SERIALIZABLE 串行化
将事务按照一种顺序的方式联结起来,防止一个事物影响其他事务。
? 锁的分类
数据库角度分类
1、 共享锁Shared Lock:共享锁锁定的资源可以被其他用户读取,但不能修改。在SELECT执行时,SQLServer会对对象进行共享锁锁定。
2、 独占锁Exclusive Lock:独占锁锁定的资源只允许进行锁定操作的程序使用,对它的任何其他操作均不会被接受。执行数据的INSERT、UPDATE、DELETE时,SQLServer会自动使用独占锁。
3、 更新锁Update Lock:更新锁是为了防止死锁设立的。当SQLServer准备更新数据时,它首先对数据对象做更新锁锁定,这样数据将不能被修改,但可以读取。等到SQLServer确定进行更新数据操作时,他会自动将更新锁换为独占锁。
程序员角度分类:
1、 乐观锁:指在处理数据时,不需要在应用程序的代码中做任何事情,就可以直接在记录上加锁,即完全依靠数据库来管理锁的工作。通常情况下使用时间戳。
2、 悲观锁:不采用数据库系统的自动管理,程序员直接管理数据或对象上的加锁处理,并负责获取共享和放弃正在使用的数据上的任何所。
? SQL Server设置隔离级别
1、 未提交的读取 READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED --未提交的读取
不发出共享锁和独占锁,可以对数据执行未提交读或脏读。
2、 提交读取 READ COMMITTED
SET TRANSACTION ISOLATION LEVEL READ COMMITTED --提交的读取
在读取数据时控制独占锁以避免读脏数据,但数据可在事务结束前更该,有可能产生不可重读读取和幻影读。
3、 重复读取 REPEATABLE READ
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ --重复读取
不发出共享锁和独占锁,可以对数据执行未提交读或脏读。
4、 串行化 SERIALIZABLE
? 防止死锁的原则
1、 尽量避免并发的执行设计到修改数据的语句。
2、 要求每个事务一次就将所有要使用的数据全部加锁,否则就不予执行。
3、 预先规定一个封锁顺序,所有的事务都必须按这个顺序对数据执行封锁。如不同的过程在事务内部对对象的更新执行顺序应尽量保持一致。
4、 每个事物的执行时间不可太长,对程序段长的事物可考虑将其分割为多个事务。
分享到:
相关推荐
数据库事务是数据库操作的核心概念,尤其在C#编程中,理解并熟练运用数据库事务对于确保数据的完整性和一致性至关重要。数据库事务确保了在多步骤操作中,如果其中一个步骤失败,整个事务可以被回滚,从而避免了数据...
【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...
数据库事务处理是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务是数据库操作的基本单元,它包含一组逻辑操作,这些操作要么全部执行,要么全部不执行,以确保数据的原子性。事务处理主要关注两个...
### SQL数据库事务机制详解 #### 事务的基本概念 在数据库管理中,事务是一个非常重要的概念。事务是指作为单个逻辑工作单元执行的一系列操作。它主要用于确保数据在更新过程中的完整性,特别是在同步发生的多步...
数据库事务是数据库操作的核心概念,它是数据库管理系统执行过程中的一个逻辑工作单位,包含了对数据库的一系列操作。在数据库系统中,事务确保数据的一致性和完整性,使得即使在系统出现故障或者并发操作的情况下,...
java代码-使用java解决数据库事务处理的源代码 ——学习参考资料:仅用于个人学习使用!
数据库事务:对数据库事务的讲解,事务的概念 理解事务的特性、分类
分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...
### 数据库事务应用详解 #### 事务处理的重要性与ACID特性 事务处理是现代数据库管理系统(DBMS)中不可或缺的一部分,尤其对于那些涉及复杂业务逻辑、需要确保数据一致性和完整性的应用来说更是如此。事务处理的...
共计132页的ppt,详细讲述数据库事务处理技术
在VC 6.0程序中执行数据库事务的一个范例,是一个数据库的高级应用例子,关于设置ADO控件,方法如下: (1)在程序中选择ResourceView视图,打开“Dialog”节点下的“IDD_AFFAIR_DIALOG”对话框资源,右键单击ADO ...
数据库事务管理及锁机制原理剖析:包括事务特性 ACID、数据隔离级别、事务实现的原理、锁机制,及过程中可能遇到的查询效率及死锁问题等
### DB2数据库事务日志详解及处理方法 #### 一、引言 在数据库管理领域,尤其是对于IBM DB2这样的大型关系型数据库管理系统而言,事务日志管理是至关重要的环节之一。事务日志用于记录数据库中的所有事务操作,确保...
本文将深入探讨C#语言中与数据库事务相关的原理及实践,包括事务的定义、特性、类型,以及如何在C#中利用Entity Framework(EF)进行事务开发和管理。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组...
数据库事务在项目中的应用.mp4
"数据库基础数据库事务处理" 数据库事务处理是数据库系统的基本概念,允许用户对数据进行更改,然后决定是保存还是放弃所做的更改。事务处理是一个不可分割的工作单位,多个步骤绑定在一起形成一个逻辑操作,包含...
数据库事务日志是数据库管理系统中一个至关重要的组成部分,它记录了数据库中所有事务的详细操作记录。这些日志对于确保数据库的一致性、持久性和可恢复性至关重要。本文将详细探讨数据库事务日志的概念、作用、实现...
数据库事务管理是数据库系统中确保数据一致性的重要机制。在数据库环境中,事务是一个逻辑工作单元,它包含了一系列数据库操作,这些操作要么全部执行,要么全部不执行。事务是动态的,与静止的程序不同,它是程序...