博客
关于我
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中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
    查看>>
    Mysql中varchar类型数字排序不对踩坑记录
    查看>>
    MySQL中一条SQL语句到底是如何执行的呢?
    查看>>
    MySQL中你必须知道的10件事,1.5万字!
    查看>>
    MySQL中使用IN()查询到底走不走索引?
    查看>>
    Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
    查看>>
    MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
    查看>>
    mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
    查看>>
    mysql中出现Unit mysql.service could not be found 的解决方法
    查看>>
    mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
    查看>>
    Mysql中各类锁的机制图文详细解析(全)
    查看>>
    MySQL中地理位置数据扩展geometry的使用心得
    查看>>
    Mysql中存储引擎简介、修改、查询、选择
    查看>>
    Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
    查看>>
    mysql中实现rownum,对结果进行排序
    查看>>
    mysql中对于数据库的基本操作
    查看>>
    Mysql中常用函数的使用示例
    查看>>
    MySql中怎样使用case-when实现判断查询结果返回
    查看>>
    Mysql中怎样使用update更新某列的数据减去指定值
    查看>>
    Mysql中怎样设置指定ip远程访问连接
    查看>>