博客
关于我
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/

    你可能感兴趣的文章
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>
    MySQL不同字符集及排序规则详解:业务场景下的最佳选
    查看>>
    Mysql不同官方版本对比
    查看>>