博客
关于我
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中 delimiter 详解
    查看>>
    MYSQL中 find_in_set() 函数用法详解
    查看>>
    MySQL中auto_increment有什么作用?(IT枫斗者)
    查看>>
    MySQL中B+Tree索引原理
    查看>>
    mysql中cast() 和convert()的用法讲解
    查看>>
    mysql中datetime与timestamp类型有什么区别
    查看>>
    MySQL中DQL语言的执行顺序
    查看>>
    mysql中floor函数的作用是什么?
    查看>>
    MySQL中group by 与 order by 一起使用排序问题
    查看>>
    mysql中having的用法
    查看>>
    MySQL中interactive_timeout和wait_timeout的区别
    查看>>
    mysql中int、bigint、smallint 和 tinyint的区别、char和varchar的区别详细介绍
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中json_extract的使用方法
    查看>>
    mysql中kill掉所有锁表的进程
    查看>>
    mysql中like % %模糊查询
    查看>>
    MySql中mvcc学习记录
    查看>>
    mysql中null和空字符串的区别与问题!
    查看>>