数据库事务

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、 每个事物的执行时间不可太长,对程序段长的事物可考虑将其分割为多个事务。


资源下载链接为: https://pan.quark.cn/s/5c50e6120579 在Android移动应用开发中,定位功能扮演着极为关键的角色,尤其是在提供导航、本地搜索等服务时,它能够帮助应用获取用户的位置信息。以“baiduGPS.rar”为例,这是一个基于百度地图API实现定位功能的示例项目,旨在展示如何在Android应用中集成百度地图的GPS定位服务。以下是对该技术的详细阐述。 百度地图API简介 百度地图API是由百度提供的一系列开放接口,开发者可以利用这些接口将百度地图的功能集成到自己的应用中,涵盖地图展示、定位、路径规划等多个方面。借助它,开发者能够开发出满足不同业务需求的定制化地图应用。 Android定位方式 Android系统支持多种定位方式,包括GPS(全球定位系统)和网络定位(通过Wi-Fi及移动网络)。开发者可以根据应用的具体需求选择合适的定位方法。在本示例中,主要采用GPS实现高精度定位。 权限声明 在Android应用中使用定位功能前,必须在Manifest.xml文件中声明相关权限。例如,添加<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />,以获取用户的精确位置信息。 百度地图SDK初始化 集成百度地图API时,需要在应用启动时初始化地图SDK。通常在Application类或Activity的onCreate()方法中调用BMapManager.init(),并设置回调监听器以处理初始化结果。 MapView的创建 在布局文件中添加MapView组件,它是地图显示的基础。通过设置其属性(如mapType、zoomLevel等),可以控制地图的显示效果。 定位服务的管理 使用百度地图API的LocationClient类来管理定位服务
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值