1. 数据库表锁定原理 1.1 目前的C/S,B/S结构都是多用户访问数据库,每个时间点会有成千上万个user来访问DB,其中也会同时存取同一份数据,会造成数据的不一致性或者读脏数据. 1.2 事务的ACID原则 1.3 锁是关系数据库很重要的一部分, 数据库必须有锁的机制来确保
1. 数据库表锁定原理
1.1 目前的C/S,B/S结构都是多用户访问数据库,每个时间点会有成千上万个user来访问DB,其中也会同时存取同一份数据,会造成数据的不一致性或者读脏数据.
1.2 事务的ACID原则
1.3 锁是关系数据库很重要的一部分, 数据库必须有锁的机制来确保数据的完整和一致性.
1.3.1 SQL Server中可以锁定的资源:
1.3.2 锁的粒度:
1.3.3 锁的升级:
锁的升级门限以及锁升级是由系统自动来确定的,不需要用户设置.
1.3.4 锁的类型:
(1) 共享锁:
共享锁用于所有的只读数据操作.
(2) 修改锁:
修改锁在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象
(3) 独占锁:
独占锁是为修改数据而保留的。它所锁定的资源,其他事务不能读取也不能修改。独占锁不能和其他锁兼容。
(4) 架构锁
结构锁分为结构修改锁(Sch-M)和结构稳定锁(Sch-S)。执行表定义语言操作时,SQL Server采用Sch-M锁,编译查询时,SQL Server采用Sch-S锁。
(5) 意向锁
意向锁说明SQL Server有在资源的低层获得共享锁或独占锁的意向。
(6) 批量修改锁
批量复制数据时使用批量修改锁
1.3.4 SQL Server锁类型
(1) HOLDLOCK: 在该表上保持共享锁,直到整个事务结束,而不是在语句执行完立即释放所添加的锁。
(2) NOLOCK:不添加共享锁和排它锁,当这个选项生效后,可能读到未提交读的数据或“脏数据”,这个选项仅仅应用于SELECT语句。
(3) PAGLOCK:指定添加页锁(否则通常可能添加表锁)。
(4) READCOMMITTED用与运行在提交读隔离级别的事务相同的锁语义执行扫描。默认情况下,SQL Server 2000 在此隔离级别上操作。
(5) READPAST: 跳过已经加锁的数据行,这个选项将使事务读取数据时跳过那些已经被其他事务锁定的数据行,而不是阻塞直到其他事务释放锁,
READPAST仅仅应用于READ COMMITTED隔离性级别下事务操作中的SELECT语句操作。
(6) READUNCOMMITTED:等同于NOLOCK。
(7) REPEATABLEREAD:设置事务为可重复读隔离性级别。
(8) ROWLOCK:使用行级锁,而不使用粒度更粗的页级锁和表级锁。
(9) SERIALIZABLE:用与运行在可串行读隔离级别的事务相同的锁语义执行扫描。等同于 HOLDLOCK。
(10) TABLOCK:指定使用表级锁,而不是使用行级或页面级的锁,SQL Server在该语句执行完后释放这个锁,而如果同时指定了HOLDLOCK,该锁一直保持到这个事务结束。 (11) TABLOCKX:指定在表上使用排它锁,这个锁可以阻止其他事务读或更新这个表的数据,直到这个语句或整个事务结束。
(12) UPDLOCK :指定在读表中数据时设置更新 锁(update lock)而不是设置共享锁,该锁一直保持到这个语句或整个事务结束,使用UPDLOCK的作用是允许用户先读取数据(而且不阻塞其他用户读数据),并且保证在后来再更新数据时,这一段时间内这些数据没有被其他用户修改。
(本段摘自CSDN博客: http://blog.csdn.net/zp752963831/archive/2009/02/18/3906477.aspx)
2. 如何解除表的锁定,解锁就是要终止锁定的那个链接,或者等待该链接事务释放.
2.1 Activity Monitor
可以通过Wait Type, Blocked By栏位查看到,SPID 54 被SPID 53 阻塞. 可以右键Details查到详细的SQL 语句,或Kill掉这个进程.
2.2 SQL Server提供几个DMV,查看locks
sys.dm_exec_requests
sys.dm_tran_locks
sys.dm_os_waiting_tasks
sys.dm_tran_database_transactions
(1)select*from sys.dm_tran_locks
where resource_type'DATABASE'--and resource_database_id=DB_ID()
(2)
<p><span>SELECT</span><span> session_id, blocking_session_id,</span><span>*</span><span>FROM</span><span> sys.dm_exec_requests </span><span>WHERE</span><span> blocking_session_id </span><span>></span><span>0</span></p>
(3)
代码
<p><span>SELECT</span><span> request_session_id </span><span>as</span><span> Spid, </span><span>Coalesce</span><span>(s.name </span><span>+</span><span>'</span><span>.</span><span>'</span><span>+</span><span> o.name </span><span>+</span><span>isnull</span><span>(</span><span>'</span><span>.</span><span>'</span><span>+</span><span> i.name,</span><span>''</span><span>), s2.name </span><span>+</span><span>'</span><span>.</span><span>'</span><span>+</span><span> o2.name, db.name) </span><span>AS</span><span> Object, l.resource_type </span><span>as</span><span> Type, request_mode </span><span>as</span><span> Mode, request_status </span><span>as</span><span> Status </span><span>FROM</span><span> sys.dm_tran_locks l </span><span>LEFT</span><span>JOIN</span><span> sys.partitions p </span><span>ON</span><span> l.resource_associated_entity_id </span><span>=</span><span> p.hobt_id </span><span>LEFT</span><span>JOIN</span><span> sys.indexes i </span><span>ON</span><span> p.</span><span>object_id</span><span>=</span><span> i.</span><span>object_id</span><span>AND</span><span> p.index_id </span><span>=</span><span> i.index_id </span><span>LEFT</span><span>JOIN</span><span> sys.objects o </span><span>ON</span><span> p.</span><span>object_id</span><span>=</span><span> o.</span><span>object_id</span><span>LEFT</span><span>JOIN</span><span> sys.schemas s </span><span>ON</span><span> o.schema_id </span><span>=</span><span> s.schema_id </span><span>LEFT</span><span>JOIN</span><span> sys.objects o2 </span><span>ON</span><span> l.resource_associated_entity_id </span><span>=</span><span> o2.</span><span>object_id</span><span>LEFT</span><span>JOIN</span><span> sys.schemas s2 </span><span>ON</span><span> o2.schema_id </span><span>=</span><span> s2.schema_id </span><span>LEFT</span><span>JOIN</span><span> sys.databases db </span><span>ON</span><span> l.resource_database_id </span><span>=</span><span> db.database_id </span><span>WHERE</span><span> resource_database_id </span><span>=</span><span>DB_ID</span><span>() </span><span>ORDER</span><span>BY</span><span> Spid, Object, </span><span>CASE</span><span> l.resource_type </span><span>When</span><span>'</span><span>database</span><span>'</span><span>Then</span><span>1</span><span>when</span><span>'</span><span>object</span><span>'</span><span>then</span><span>2</span><span>when</span><span>'</span><span>page</span><span>'</span><span>then</span><span>3</span><span>when</span><span>'</span><span>key</span><span>'</span><span>then</span><span>4</span><span>Else</span><span>5</span><span>end</span></p>

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

選擇PostgreSQL而非MySQL的場景包括:1)需要復雜查詢和高級SQL功能,2)要求嚴格的數據完整性和ACID遵從性,3)需要高級空間功能,4)處理大數據集時需要高性能。 PostgreSQL在這些方面表現出色,適合需要復雜數據處理和高數據完整性的項目。

MySQL數據庫的安全可以通過以下措施實現:1.用戶權限管理:通過CREATEUSER和GRANT命令嚴格控制訪問權限。 2.加密傳輸:配置SSL/TLS確保數據傳輸安全。 3.數據庫備份和恢復:使用mysqldump或mysqlpump定期備份數據。 4.高級安全策略:使用防火牆限制訪問,並啟用審計日誌記錄操作。 5.性能優化與最佳實踐:通過索引和查詢優化以及定期維護兼顧安全和性能。

如何有效監控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。 1.使用mysqladmin查看連接數。 2.用SHOWGLOBALSTATUS查看查詢數。 3.PMM提供詳細性能數據和圖形化界面。 4.MySQLEnterpriseMonitor提供豐富的監控功能和報警機制。

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显著差异,选择时需考虑项目规模和未来扩展性。

在需要高可用性、高級安全性和良好集成性的企業級應用場景下,應選擇SQLServer而不是MySQL。 1)SQLServer提供企業級功能,如高可用性和高級安全性。 2)它與微軟生態系統如VisualStudio和PowerBI緊密集成。 3)SQLServer在性能優化方面表現出色,支持內存優化表和列存儲索引。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

Dreamweaver Mac版
視覺化網頁開發工具

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。