您的位置:首页 > 数据库

12事务与并发控制(数据库原理)

2019-06-19 13:25 1326 查看

事务与并发控制

目录

一、事务概述
二、事务的类型
三、事务处理语句
四、事务的并发控制

一、事务概述

1、关系数据库的四个特征:

  • 安全性:防止未授权的用户随意更改数据库中的数据
  • 完整性:实体完整性、域完整性和参照完整性,保证数据有效
  • 并发性:允许多个用户并行的存取数据库
  • 监测性:对数据库性能进行监测,发现影响性能的因素,针对性解决

2、并发控制: 以事务为单位。为确保数据的完整性和一致性需要使用锁定
3、事务: 保证数据的一致性,数据库应用程序的基本逻辑单元
4、事务的经典是要案例: 取钱时取了多少钱对应卡上余额要同时减去多少
5、事物要求处理时需满足的原则:

  • 原子性:要么都执行,要么都不执行
  • 一致性:数据操作前后数据都要保持一致性
  • 隔离性:独立性,并行事务相互独立
  • 持久性:事务一旦提交,除非修改否则永久写入数据库中

二、事务的类型

1、根据系统设置分类

  • 系统事务:比如数据库的增删改查、create、alter、drop、授权、truncate等本身就是一个事务
  • 用户定义事务:
    begin transaction ——定义明确用户定义的事务
    commint transaction,rollback transaction——结束事务语句,提交事务和回滚事务。如果没有这两条,则系统会将从事务开始到关闭连接之前的内容都当作一个事务
  • 分布式事务:用户定义。针对多个服务器

2、根据运行模式分类

  • 自动提交事务:就是一条SQL语句就是一个事务
  • 显式事务:都以begin transaction、rollback transaction、commit transaction开始、提交、回滚的事务
  • 隐士事务:前一个事务完成时新事务隐式开始,但每个事务都以commit transaction、rollback transaction结束
  • 批处理级事务:活动结果集(Mars),在Mars中启动的显式或隐式事务变为批处理级事务

三、事务处理语句

1、事务处理的T-SQL:

begin transaction (事务的开始)
commit transaction(提交事务)
rollback transaction(事务执行失败后回滚事务)
save transaction (事务内设置的保存点,回滚时可以回滚到保存点)

(1)、begin transaction语句

begin { tran | transaction } [ transaction_name | @tran_name_variable ] [ with mark [ 'description ’ ] ]

  • 缩写:begin tran
  • transaction_name:事务名,可有可无
  • @tran_name_variable:含事务名的变量
  • with Mark:日志中标记事务
  • description:描述日志标记的字符串

(2)、commit transaction语句

commit [ { tran | transaction } [ transaction_name | @tran_name_variable ] ]

  • commit transaction语句执行后不能执行事务回滚
  • 事务中嵌套使用commit transaction时,内部事务提交不释放资源,也不写入到数据库,外部事务提交后才释放和写入

(3)、rollback transaction语句: 回滚到执行前的状态或者保存点

rollback [ tran | transaction [ transaction_name | @tran_name_variable | savepoint_name |@savepoint_variable ] ]

  • 不指定事务名和保存点,则回滚到执行前的状态
  • 执行commit后,这条语句将执行不了

(3)、save transaction语句

save { tran | transaction } { savepoint_name | @savepoint_variable }

  • 增删改查可以放在事务里,其他例如create不能放到事务中
  • 可以使用全局变量@@error查看是否发生了错误

四、事务的并发控制

1、并发控制的目的: 同时更新行时保证数据库的完整性,用户操作互不影响且能保证各自的数据正确
2、并发带来的问题: 都是读到不准确的数据

  • 丢失修改: 就是本来读取的是修改后的数据,结果读的是未修改的数据
  • 脏读: 读到不准确的数
  • 不可重复读: 在一个事务中多次读同一数据,有一次修改,另一次读取不是同一个数
  • 幻读: 事务不是独立执行时发生的一种现象。例如:一个事务对表进行修改,同时又插入数据,导致从第一个事务的角度看,表中还有没有修改的行,就像幻觉一样

3、锁的基本概念:

  • 锁是实现并发控制的主要方法,防止其他事务访问指定资源的主要手段(上锁之后想让别人访问就开锁,不想让访问就锁上)
  • 最小空间管理 单位是页,一个页有8KB,存放数据、日志、、索引等,表中一行数据不能跨页
  • 页上的空间管理单位是簇,一个簇有8个页,表和索引的最小占用单位
  • 锁是一种软件机制,上锁就是占用某种资源(表、数据行和索引),不允许其他用户操作,保证数据一致
  • 锁是数据库自动根据用户操作添加和升级的

4、锁的类型:

  • 共享锁S: 允许并发事务读取同一个资源,任何事务都不能修改数据,一旦读取数据后立即开锁,也可以根据需要保留锁
  • 排他锁X: 防止并发事务对资源访问,其他任何事务都不能读取或修改X锁锁定的数据。增删改回自动使用X锁,直到事务执行完,但是有对象有其他锁后无法再加X锁
  • 更新锁U锁: 防止死锁。锁定的对象不能被修改但是能被读取,U锁可以和S锁共存
  • 意向锁I锁: 对加锁的上次资源加I锁,目的是最小化锁之间的冲突
  • **模式锁:**保证表或索引被使用时,结构模式不能删除(模式稳定锁)或修改(模式修改锁)
  • 大容量更新锁: 大量复制数据到表,且指定tablelock提示 或使用sp_tableoption设置了table_lock_on_bulk表选项时,使用大容量更新锁

5、意向锁I锁分类:

  • 意向共享锁IS锁: 如果想对某个资源加S锁,则要首先对包含该元组的关系和数据库加IS锁
  • 意向排他锁IX锁: 如果想对某个资源加X锁,则要首先对包含该元组的关系和数据库加IX锁
  • 共享意向排他锁SIX(SIX=S+IX): 如果对某个表加SIX锁,则表示要读取整个表和修改个别元组

6、锁的信息
(1)锁的兼容性问题:
(2)、查看锁的信息
三种方式:管理器(对象资源管理器—》管理—》右击活动监视器—》查看进程即可)和存储过程(SP_LOCK)或查询系统表(sys.dm_tran_locks)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: