MySQL 事務(wù)

2022-02-17 14:42 更新

MySQL 事務(wù)主要用于處理操作量大,復(fù)雜度高的數(shù)據(jù)。比如說,在人員管理系統(tǒng)中,你刪除一個(gè)人員,你即需要?jiǎng)h除人員的基本資料,也要?jiǎng)h除和該人員相關(guān)的信息,如信箱,文章等等,這樣,這些數(shù)據(jù)庫操作語句就構(gòu)成一個(gè)事務(wù)!

  • 在 MySQL 中只有使用了 Innodb 數(shù)據(jù)庫引擎的數(shù)據(jù)庫或表才支持事務(wù)。
  • 事務(wù)處理可以用來維護(hù)數(shù)據(jù)庫的完整性,保證成批的SQL語句要么全部執(zhí)行,要么全部不執(zhí)行。
  • 事務(wù)用來管理 insert , update , delete 語句。

一般來說,事務(wù)是必須滿足4個(gè)條件(ACID): Atomicity(原子性或不可分割性)、Consistency(一致性)、Isolation(隔離性或獨(dú)立性)、Durability(持久性)

  • 1、原子性:一組事務(wù),要么成功;要么撤回,即事務(wù)在執(zhí)行過程中出錯(cuò)會(huì)回滾到事務(wù)開始前的狀態(tài)。
  • 2、一致性 : 一個(gè)事務(wù)不論是開始前還是結(jié)束后,數(shù)據(jù)庫的完整性都沒有被破壞。因此寫入的數(shù)據(jù)必須完全符合所有預(yù)設(shè)規(guī)則(資料精確度、串聯(lián)性以及后續(xù)數(shù)據(jù)庫能夠自發(fā)完成預(yù)定工作)。
  • 3、隔離性:數(shù)據(jù)庫允許多個(gè)事務(wù)并發(fā)的同時(shí)對(duì)其數(shù)據(jù)進(jìn)行讀寫修改等操作,隔離性可以防止多個(gè)事務(wù)并發(fā)執(zhí)行時(shí)由于交叉執(zhí)行而導(dǎo)致數(shù)據(jù)的不一致。事務(wù)隔離可分為:Read uncommitted(讀未提交)、Read committed(讀提交)、Repeatable read(可重復(fù)讀)、Serializable(串行化)。
  • 4、持久性:事務(wù)在處理結(jié)束后對(duì)數(shù)據(jù)做出的修改是永久的,無法丟失。

事務(wù)控制語句

1,顯式的開始一個(gè)事務(wù):

start transaction

begin

2, 做保存點(diǎn),一個(gè)事務(wù)中可以有多個(gè)保存點(diǎn):

savepoint 保存點(diǎn)名稱

3, 提交事務(wù),并使數(shù)據(jù)庫中進(jìn)行的所有修改成為永久性的:

commit

commit work

4,回滾結(jié)束用戶的事務(wù),并撤銷正在進(jìn)行的所有未提交的修改:

rollback

rollback work

5.刪除一個(gè)事務(wù)的保存點(diǎn),若沒有指定保存點(diǎn),執(zhí)行該語句操作會(huì)拋錯(cuò)。

release savepoint 保存點(diǎn)名稱

6.將事務(wù)滾回標(biāo)記點(diǎn):

rollback to 標(biāo)記點(diǎn)

7.設(shè)置事務(wù)的隔離級(jí)別。InnoDB 存儲(chǔ)引擎提供事務(wù)的隔離級(jí)別有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。

set transaction

事務(wù)處理方法

1.用 begin , rollback , commit 來實(shí)現(xiàn)事務(wù)處理。

2.用 set 來改變 MySQL 的自動(dòng)提交模式。

  • set autocommit = 0 (禁止自動(dòng)提交)。
  • set autocommit = 1 (開啟自動(dòng)提交)。

PHP中使用事務(wù)實(shí)例

<?php
$handler=mysql_connect("localhost","root","password");
mysql_select_db("task");
mysql_query("SET AUTOCOMMIT=0");//設(shè)置為不自動(dòng)提交,因?yàn)镸YSQL默認(rèn)立即執(zhí)行 mysql_query("BEGIN");//開始事務(wù)定義
if(!mysql_query("insert into trans (id) values('2')"))
{
mysql_query("ROOLBACK");//判斷當(dāng)執(zhí)行失敗時(shí)回滾
}
if(!mysql_query("insert into trans (id) values('4')"))
{
mysql_query("ROOLBACK");//判斷執(zhí)行失敗回滾
}
mysql_query("COMMIT");//執(zhí)行事務(wù)
mysql_close($handler);
?>


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)