博客
关于我
15.sql server数据库事务和数据库锁、触发器、游标、视图、自定义函数、字段(by-朝夕)
阅读量:536 次
发布时间:2019-03-08

本文共 1352 字,大约阅读时间需要 4 分钟。

数据库事务与锁

1. 数据库事务

数据库事务是一组访问和操作数据库数据的数据库操作序列,所有操作要么全部成功,要么全部失败,属于一个不可分割的工作单位。事务的核心特性是保证数据的完整性。

  • 事务的特性(ACID)
    • 原子性 (Atomicity):要么全部成功,要么全部失败。
    • 一致性 (Consistency):事务执行后,数据处于正确的状态。
    • 隔离性 (Isolation):避免数据冗余,确保不同事务间的数据操作隔离。
    • 持久性 (Durability):提交事务后,修改的数据不会丢失。

2. 锁

锁是确保多线程环境下数据库数据操作的正确性的机制。选择合适的锁类型和粒度可以有效避免并发问题。

#####乐观锁基于程序设计,不依赖数据库锁机制。通过版本号和时间戳判断数据是否被修改:

  • 使用版本号(如 TimestampVersion)标识记录。
  • 查询数据后,检查版本号是否一致。
  • 若一致,更新并保留新的版本号;否则,日志异常并滚回。
  • #####悲观锁依赖数据库锁机制,确保并发操作的安全性:

    • 共享锁 (S锁):读锁,允许其他事务读取但不允许修改。
    • 排他的锁 (X锁):写锁,不允许其他事务读或写。
    • 更新锁 (U锁):先读后写,允许事务在读取阶段不阻塞其他事务。
    • 表锁 (Table Lock):锁定整个表。
    • 行锁 (Row Lock):锁定特定行。

    3. 锁的使用

    锁可以通过以下方式指定:

    • NOLOCK:不可重复读,可能读取未提交数据。
    • ROWLOCK:默认锁定行级。
    • 页锁 (PAGLOCK):锁定数据页。
    • 表锁 (TABLOCK):锁定整个表。
    • ``HOLDLOCK**或**SERIALIZABLE`:保持锁直到事务完成,确保高一致性。

    4. 避免死锁

    死锁难以完全避免,但可以通过以下方式降低概率:

    • 使用乐观锁:减少锁争夺,提升性能。
    • 统一操作顺序:指定操作依次执行,减少死锁风险。
    • 锁定最小单位:细化锁定粒度,减少冲突。
    • 减少并发度:采用微服务架构或分区处理。
    • 设置锁超时:防止长时间等待导致死锁。

    5. 示例测试

    使用 TABLOCKX 锁在两个窗口中操作:

  • 第一个窗口:
  • BEGIN TRAN SELECT * FROM [User] WITH (TABLOCKX) WAITFOR Delay '00:00:10.01' ROLLBACK TRAN
    1. 第二个窗口:
    2. BEGIN TRAN SELECT * FROM [User] WITH (TABLOCKX) ROLLBACK TRAN

      锁存在导致第二个窗口无法执行,需要 designers 处理。

      6. 存储过程

      存储过程是数据库中的可执行程序,用于封装和管理数据库操作。

      存储过程的优势
      • 模块化:业务逻辑可分解为多个存储过程。
      • 性能提升:预编译存储过程加快执行速度。
      • 减少网络流量:减少数据传输量。
      • 内部安全机制:隔离执行权限。
      常用语句
      exec sp_databases; --查看数据库exec sp_tables; --查看表exec sp_columns student; --查看列

      7. 备注

      数据库事务和锁是系统设计的核心,需根据具体需求选择合适的策略。优化数据库性能和可靠性需要综合考虑并发控制和锁机制。

    转载地址:http://uetiz.baihongyu.com/

    你可能感兴趣的文章
    Mysql-存储引擎
    查看>>
    mysql-开启慢查询&所有操作记录日志
    查看>>
    MySQL-数据目录
    查看>>
    MySQL-数据页的结构
    查看>>
    MySQL-架构篇
    查看>>
    MySQL-索引的分类(聚簇索引、二级索引、联合索引)
    查看>>
    Mysql-触发器及创建触发器失败原因
    查看>>
    MySQL-连接
    查看>>
    mysql-递归查询(二)
    查看>>
    MySQL5.1安装
    查看>>
    mysql5.5和5.6版本间的坑
    查看>>
    mysql5.5最简安装教程
    查看>>
    mysql5.6 TIME,DATETIME,TIMESTAMP
    查看>>
    mysql5.6.21重置数据库的root密码
    查看>>
    Mysql5.6主从复制-基于binlog
    查看>>
    MySQL5.6忘记root密码(win平台)
    查看>>
    MySQL5.6的Linux安装shell脚本之二进制安装(一)
    查看>>
    MySQL5.6的zip包安装教程
    查看>>
    mysql5.7 for windows_MySQL 5.7 for Windows 解压缩版配置安装
    查看>>
    Webpack 基本环境搭建
    查看>>