搜尋
首頁資料庫mysql教程php mysql事务处理

文章简单的介绍了关于php mysql事务处理的细节以及处理时锁问题,有需要的朋友可以详细的看看吧。

事务

BEGIN;
COMMIT;
一段代码, 修改当前表的两个字段

先查找出来中,保存到变量里面,然后相加放到第二个字段的value 里面

 

 代码如下 复制代码
BEGIN;
SELECT value into  @short_destiption  FROM `catalog_product_entity_text` WHERE entity_id = 388 and attribute_id = 62;
SELECT value into  @destiption  FROM `catalog_product_entity_text` WHERE entity_id = 388 and attribute_id = 61;
update catalog_product_entity_text set value = concat( @short_destiption,@destiption)  where  entity_id = 388 and attribute_id ='61';
COMMIT;


务操作,要保证的三个原则性:

原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全部执行,要么全都不执行;

一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态;

隔离性(Isolation):系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行;

持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。


于是,我们假设两个对象A和B

并发对象A 和B

初始状态数据表查询结果:


事务开始的顺序 A->B

A:开始事务


此刻没有提交进行commit

在此状态下B开始了自己的MySQL事务处理:


显然,在A没有进行Commit行为的时候,B的事务中的动作无法完成,一直处于事务等待阶段,前提是在没有超出时限,B的动作无法提交。

此刻,如果A进行Commit:


此刻 B的动作中,由等待的


转变到


说明A完成事务开始解锁,B事务可以进行,但是此刻B事务没有提交(Commit)

注意:在这里我们进行两个操作,就是两个对象进行查询

A的查询:


依然存在ID为1的这项,原因是B的结果没提交,但A依旧可以读该项数据,但是数据为删除前的数据。

但是,对照B的查询:


可以知道,B对象结果已经在处理了,只是没有提交解锁。

分析可以知道,A读的是B没有提交前的结果集合,但B读的是自己操作的结果集,当B完成提交的时候

此刻,A的结果集合


发现现在状态下和B的集合一样,A=B,这也是在理论值的范围内的。

由此,可以发现其实MySQL锁的简单性,当然,也说明当数据库进行锁操作时候,只能是写操作控制,对于读数据,往往只能访问到修改前的数据,这部分数据常常被称为”dirty”或脏数据。在现实中,我们常常是有这样的需求,当A进行写操作时候,期望B不要读数据,是对读行为的控制。


1.1.       基础知识和相关概念

1)全部的表类型都可以使用锁,但是只有InnoDB和BDB才有内置的事务功能。

2)使用begin开始事务,使用commit结束事务,中间可以使用rollback回滚事务。

3)在默认情况下,InnoDB表支持一致读。

SQL标准中定义了4个隔离级别:read uncommited,read commited,repeatable read,serializable。

       read uncommited即脏读,一个事务修改了一行,另一个事务也可以读到该行。

       如果第一个事务执行了回滚,那么第二个事务读取的就是从来没有正式出现过的值。?

       read commited即一致读,试图通过只读取提交的值的方式来解决脏读的问题,

       但是这又引起了不可重复读取的问题。

       一个事务执行一个查询,读取了大量的数据行。在它结束读取之前,另一个事务可能完成了对数据行的更改。当第一个事务试图再次执行同一个查询,服务器就会返回不同的结果。

       repeatable read即可重复读,在一个事务对数据行执行读取或写入操作时锁定了这些数据行。

       但是这种方式又引发了幻想读的问题。

       因为只能锁定读取或写入的行,不能阻止另一个事务插入数据,后期执行同样的查询会产生更多的结果。

       serializable模式中,事务被强制为依次执行。这是SQL标准建议的默认行为。

4)如果多个事务更新了同一行,就可以通过回滚其中一个事务来解除死锁。

5)MySQL允许利用set transaction来设置隔离级别。

6)事务只用于insert和update语句来更新数据表,不能用于对表结构的更改。执行一条更改表结构或begin则会立即提交当前的事务。

7)所有表类型都支持表级锁,但是MyISAM只支持表级锁。

8)有两种类型的表级锁:读锁和写锁。

读锁是共享锁,支持并发读,写操作被锁。

写锁是独占锁,上锁期间其他线程不能读表或写表。

8)如果要支持并发读写,建议采用InnoDB表,因为它是采用行级锁,可以获得更多的更新性能。

9)很多时候,可以通过经验来评估什么样的锁对应用程序更合适,不过通常很难说一个锁比别的更好,这全都要依据应用程序来决定,不同的地方可能需要不同的锁。当前MySQL已经支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁了,BDB 表支持页级锁,InnoDB 表支持行级锁。

10)MySQL的表级锁都是写锁优先,而且是采用排队机制,这样不会出现死锁的情况。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。
1.2.       不同锁的优缺点及选择

行级锁的优点及选择:

1)在很多线程请求不同记录时减少冲突锁。

2)事务回滚时减少改变数据。

3)使长时间对单独的一行记录加锁成为可能。

 

行级锁的缺点:

1)比页级锁和表级锁消耗更多的内存。

2)当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。

3)当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。

4)使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。

5)可以用应用程序级锁来代替行级锁,例如MySQL中的 GET_LOCK() 和 RELEASE_LOCK()。但它们是劝告锁(原文:These are advisory locks),因此只能用于安全可信的应用程序中。

6)对于 InnoDB 和 BDB 表,MySQL只有在指定用 LOCK TABLES 锁表时才使用表级锁。在这两种表中,建议最好不要使用 LOCK TABLES,因为 InnoDB 自动采用行级锁,BDB 用页级锁来保证事务的隔离。

 

表锁的优点及选择:

1)很多操作都是读表。

2)在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;DELETE FROM tbl_name WHERE unique_key_col=key_value;

3)SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。

4)很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。

 

表锁的缺点:

1)一个客户端提交了一个需要长时间运行的 SELECT 操作。

2)其他客户端对同一个表提交了 UPDATE 操作,这个客户端就要等到 SELECT 完成了才能开始执行。

3)其他客户端也对同一个表提交了 SELECT 请求。由于 UPDATE的优先级高于 SELECT,所以 SELECT 就会先等到 UPDATE 完成了之后才开始执行,它也在等待第一个 SELECT操作。

 
1.3.       如何避免锁的资源竞争

1)让 SELECT 速度尽量快,这可能需要创建一些摘要表。

2)启动 d 时使用参数 --low-priority-updates。这就会让更新操作的优先级低于 SELECT。

这种情况下,在上面的假设中,第二个 SELECT 就会在 INSERT 之前执行了,而且也无需等待第一个SELECT 了。

3)可以执行 SET LOW_PRIORITY_UPDATES=1 命令,指定所有的更新操作都放到一个指定的链接中去完成。

4)用 LOW_PRIORITY 属性来降低 INSERT,UPDATE,DELETE 的优先级。

5)用HIGH_PRIORITY 来提高 SELECT 语句的优先级。

6)从MySQL 3.23.7 开始,可以在启动 mysqld 时指定系统变量 max_write_lock_count 为一个比较低的值,它能强制临时地提高表的插入数达到一个特定值后的所有 SELECT 操作的优先级。它允许在 WRITE 锁达到一定数量后有 READ 锁。

7)当 INSERT 和 SELECT 一起使用出现问题时,可以转而采用 MyISAM 表,它支持并发的SELECT 和 INSERT 操作。

8)当在同一个表上同时有插入和删除操作时,INSERT DELAYED 可能会很有用。

9)当SELECT 和 DELETE 一起使用出现问题时,DELETE 的 LIMIT 参数可能会很有用。

10)执行SELECT 时使用 SQL_BUFFER_RESULT 有助于减短锁表的持续时间。

11)可以修改源代码 `mysys/thr_lock.c',只用一个所队列。这种情况下,写锁和读锁的优先级就一样了,这对一些应用可能有帮助。

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
您什麼時候應該使用複合索引與多個單列索引?您什麼時候應該使用複合索引與多個單列索引?Apr 11, 2025 am 12:06 AM

在數據庫優化中,應根據查詢需求選擇索引策略:1.當查詢涉及多個列且條件順序固定時,使用複合索引;2.當查詢涉及多個列但條件順序不固定時,使用多個單列索引。複合索引適用於優化多列查詢,單列索引則適合單列查詢。

如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)如何識別和優化MySQL中的慢速查詢? (慢查詢日誌,performance_schema)Apr 10, 2025 am 09:36 AM

要優化MySQL慢查詢,需使用slowquerylog和performance_schema:1.啟用slowquerylog並設置閾值,記錄慢查詢;2.利用performance_schema分析查詢執行細節,找出性能瓶頸並優化。

MySQL和SQL:開發人員的基本技能MySQL和SQL:開發人員的基本技能Apr 10, 2025 am 09:30 AM

MySQL和SQL是開發者必備技能。 1.MySQL是開源的關係型數據庫管理系統,SQL是用於管理和操作數據庫的標準語言。 2.MySQL通過高效的數據存儲和檢索功能支持多種存儲引擎,SQL通過簡單語句完成複雜數據操作。 3.使用示例包括基本查詢和高級查詢,如按條件過濾和排序。 4.常見錯誤包括語法錯誤和性能問題,可通過檢查SQL語句和使用EXPLAIN命令優化。 5.性能優化技巧包括使用索引、避免全表掃描、優化JOIN操作和提升代碼可讀性。

描述MySQL異步主奴隸複製過程。描述MySQL異步主奴隸複製過程。Apr 10, 2025 am 09:30 AM

MySQL異步主從復制通過binlog實現數據同步,提升讀性能和高可用性。 1)主服務器記錄變更到binlog;2)從服務器通過I/O線程讀取binlog;3)從服務器的SQL線程應用binlog同步數據。

mysql:簡單的概念,用於輕鬆學習mysql:簡單的概念,用於輕鬆學習Apr 10, 2025 am 09:29 AM

MySQL是一個開源的關係型數據庫管理系統。 1)創建數據庫和表:使用CREATEDATABASE和CREATETABLE命令。 2)基本操作:INSERT、UPDATE、DELETE和SELECT。 3)高級操作:JOIN、子查詢和事務處理。 4)調試技巧:檢查語法、數據類型和權限。 5)優化建議:使用索引、避免SELECT*和使用事務。

MySQL:數據庫的用戶友好介紹MySQL:數據庫的用戶友好介紹Apr 10, 2025 am 09:27 AM

MySQL的安裝和基本操作包括:1.下載並安裝MySQL,設置根用戶密碼;2.使用SQL命令創建數據庫和表,如CREATEDATABASE和CREATETABLE;3.執行CRUD操作,使用INSERT,SELECT,UPDATE,DELETE命令;4.創建索引和存儲過程以優化性能和實現複雜邏輯。通過這些步驟,你可以從零開始構建和管理MySQL數據庫。

InnoDB緩衝池如何工作,為什麼對性能至關重要?InnoDB緩衝池如何工作,為什麼對性能至關重要?Apr 09, 2025 am 12:12 AM

InnoDBBufferPool通過將數據和索引頁加載到內存中來提升MySQL數據庫的性能。 1)數據頁加載到BufferPool中,減少磁盤I/O。 2)臟頁被標記並定期刷新到磁盤。 3)LRU算法管理數據頁淘汰。 4)預讀機制提前加載可能需要的數據頁。

MySQL:初學者的數據管理易用性MySQL:初學者的數據管理易用性Apr 09, 2025 am 12:07 AM

MySQL適合初學者使用,因為它安裝簡單、功能強大且易於管理數據。 1.安裝和配置簡單,適用於多種操作系統。 2.支持基本操作如創建數據庫和表、插入、查詢、更新和刪除數據。 3.提供高級功能如JOIN操作和子查詢。 4.可以通過索引、查詢優化和分錶分區來提升性能。 5.支持備份、恢復和安全措施,確保數據的安全和一致性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

MantisBT

MantisBT

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