共計 5193 個字符,預計需要花費 13 分鐘才能閱讀完成。
這篇文章給大家介紹 MySQL 事務的介紹以及示例分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
1. 什么是事務:事務是一個不可分割的工作邏輯單元,在數據庫系統上執行并發操作時事務是做為最小的控制單元來使用的。他包含的所有數據庫操作命令作為一個整體一起向系提交或撤消,這一組數據庫操作命令要么都執行,要么都不執行。2. 事務的語句 開始事物:BEGIN TRANSACTION 提交事物:COMMIT TRANSACTION 回滾事務:ROLLBACK TRANSACTION 3. 事務的 4 個屬性 ①原子性 (Atomicity):事務中的所有元素作為一個整體提交或回滾,事務的個元素是不可分的,事務是一個完整操作。②一致性 (Consistemcy):事物完成時,數據必須是一致的,也就是說,和事物開始之前,數據存儲中的數據處于一致狀態。保證數據的無損。③隔離性 (Isolation):對數據進行修改的多個事務是彼此隔離的。這表明事務必須是獨立的,不應該以任何方式以來于或影響其他事務。④持久性 (Durability):事務完成之后,它對于系統的影響是永久的,該修改即使出現系統故障也將一直保留,真實的修改了數據庫 4. 事務的保存點 SAVE TRANSACTION 保存點名稱 – 自定義保存點的名稱和位置 ROLLBACK TRANSACTION 保存點名稱 – 回滾到自定義的保存點 ——————- 實 —————— 例 —————————- BEGIN TRANSACTION– 開始事務 DECLARE @errorSun INT – 定義錯誤計數器 SET @errorSun=0 – 沒錯為 0 UPDATE a SET id=232 WHERE a=1 – 事務操作 SQL 語句 SET @errorSun=@errorSun+@@ERROR – 累計是否有錯 UPDATE aa SET id=2 WHERE a=1 – 事務操作 SQL 語句 SET @errorSun=@errorSun+@@ERROR – 累計是否有錯 IF @errorSun 0 BEGIN PRINT 有錯誤,回滾 ROLLBACK TRANSACTION– 事務回滾語句 END ELSE BEGIN PRINT 成功,提交 COMMIT TRANSACTION– 事務提交語句 END 示例:創建一個存儲過程, 向兩個表中同時插入數據復制代碼 代碼如下:
Create proc RegisterUser (@usrName varchar(30), @usrPasswd varchar(30),@age int,@sex varchar(10), @PhoneNum varchar(20), @Address varchar(50) ) as begin begin tran insert into userinfo(userName,userPasswd) values(@usrName,@usrPasswd) if @@error 0 begin rollback tran return -1 end insert into userdoc(userName,age,sex,PhoneNumber,Address)values(@Usrname,@age,@sex,@PhoneNum,@Address) if @@error 0 begin rollback tran return -1 end commit tran return 0 end
事務的分類 按事務的啟動與執行方式,可以將事務分為 3 類: 顯示事務 也稱之為用戶定義或用戶指定的事務,即可以顯式地定義啟動和結束的事務。分布式事務屬于顯示事務 自動提交事務 默認事務管理模式。如果一個語句成功地完成,則提交該語句;如果遇到錯誤,則回滾該語句。隱性事務 當連接以此模式進行操作時,sql 將在提交或回滾當前事務后自動啟動新事務。無須描述事務的開始,只需提交或回滾每個事務。它生成連續的事務鏈。一、顯示事務 通過 begin transacton、commit transaction、commit work、rollback transaction 或 rollback work 等語句完成。1、啟動事務 格式:begin tran 事務名或變量 with mark 描述 2、結束事務 格式:commit tran 事務名或變量 (事務名與 begin tran 中的事務名一致 或 commit work 但此沒有參數 3、回滾事務 rollback tran 事務名或變量 | savepoint_name | savepoint_variable 或 rollback work 說明: 清除自事務的起點或到某個保存點所做的所有數據修改 4、在事務內設置保存點 格式:save tran savepoint_name | savepoint_variable 示例: 復制代碼 代碼如下:
use bookdb go begin tran mytran insert into book values(9, windows2000 ,1,22, 出版社) save tran mysave delete book where book_id=9 rollback tran mysave commit tran go select * from book go
可以知道,上面的語句執行后,在 book 中插入了一筆記錄,而并沒有刪除。因為使用 rollback tran mysave 語句將操作回滾到了刪除前的保存點處。5、標記事務 格式:with mark 例:使用數據庫標記將日志恢復到預定義時間點的語句 在事務日志中置入一個標記。請注意,被標記的事務至少須提交一個更新,以標記該日志。BEGIN TRAN MyMark WITH MARK UPDATE pubs.dbo.LastLogMark SET MarkTime = GETDATE() COMMIT TRAN MyMark 按照您常用的方法備份事務日志。BACKUP LOG pubs TO DISK= C:\Backups\Fullbackup.bak WITH INIT 現在您可以將數據庫恢復至日志標記點。首先恢復數據庫,并使其為接受日志恢復做好準備。RESTORE DATABASE pubs FROM DISK=N C:\Backups\Fullbackup.bak WITH NORECOVERY 現在將日志恢復至包含該標記的時間點,并使其可供使用。請注意,STOPAT 在數據庫正在執行大容量日志時禁止執行。RESTORE LOG pubs FROM DISK=N C:\Backups\Logbackup.bak WITH RECOVERY, STOPAT= 02/11/2002 17:35:00 5、不能用于事務的操作 創建數據庫 create database 修改數據庫 alter database 刪除數據庫 drop database 恢復數據庫 restore database 加載數據庫 load database 備份日志文件 backup log 恢復日志文件 restore log 更新統計數據 update statitics 授權操作 grant 復制事務日志 dump tran 磁盤初始化 disk init 更新使用 sp_configure 后的系統配置 reconfigure 二、自動提交事務 sql 連接在 begin tran 語句啟動顯式事務,或隱性事務模式設置為打開之前,將以自動提交模式進行操作。當提交或回滾顯式事務,或者關閉隱性事務模式時,將返回到自動提交模式。示例: 由于編譯錯誤,使得三個 insert 都沒執行復制代碼 代碼如下:
use test go create table testback(cola int primary key ,colb char(3)) go insert into testback values(1, aaa) insert into testback values(2, bbb) insert into testback value(3, ccc) go select * from testback go
沒有任何結果返回 三、隱式事務 通過 API 函數或 Transact-SQL SET IMPLICIT_TRANSACTIONS ON 語句,將隱性事務模式設置為打開。下一個語句自動啟動一個新事務。當該事務完成時,再下一個 Transact-SQL 語句又將啟動一個新事務。當有大量的 DDL 和 DML 命令執行時會自動開始,并一直保持到用戶明確提交為止,切換隱式事務可以用 SET IMPLICIT_TRANSACTIONS 為連接設置隱性事務模式. 當設置為 ON 時,SET IMPLICIT_TRANSACTIONS 將連接設置為隱性事務模式。當設置為 OFF 時,則使連接返回到自動提交事務模式 語句包括: alter table insert open create delete revoke drop select fetch truncate table grant update 示例: 下面使用顯式與隱式事務。它使用 @@tracount 函數演示打開的事務與關閉的事務: 復制代碼 代碼如下:
use test go set nocount on create table t1(a int) go insert into t1 values(1) go print 使用顯式事務 begin tran insert into t1 values(2) print 事務外的事務數目: +cast(@@trancount as char(5)) commint tran print 事務外的事務數目: +cast(@@trancount as char(5)) go print go set implicit_transactions on go print 使用隱式事務 go insert into t1 values*4) print 事務內的事務數目: +cast(@@trancount as char(5)) commint tran print 事務外的事務數目: +cast(@@trancount as char(5)) go
執行結果: 使用顯示事務 事務內的事務數目:2 事務外的事務數目:1 使用隱式事務 事務內的事務數目:1 事務外的事務數目:0 四、分布式事務 跨越兩個或多個數據庫的單個 sql server 中的事務就是分布式事務。與本地事務區別: 必須由事務管理器管理,以盡量避免出現因網絡故障而導致一個事務由某些資源管理器成功提交,但由另一些資源管理器回滾的情況。sql server 可以由 DTc microsoft distributed transaction coordinator 來支持處理分布式事務, 可以使用 BEgin distributed transaction 命令啟動一個分布式事務處理 分二階段: A 準備階段 B 提交階段 執行教程: 1、sql 腳本或應用程序連接執行啟動分布式事務的 sql 語句 2、執行該語句的 sql 在為事務中的主控服務器 3、腳本或應用程序對鏈接的服務器執行分布式查詢,或對遠程服務器執行遠程存儲過程。4、當執行了分布式查詢或遠程過程調用后,主控服務器將自動調用 msdtc 以便登記分布式事務中鏈接的服務器和遠程服務器 5、當腳本或應用程序發出 commit 或 rollback 語句時,主控 sql 將調用 msdtc 管理兩階段提交過程,或者通知鏈接的服務器和遠程服務器回滾其事務。
mysql 事務的一個例子
復制代碼 代碼如下:
begin tran declare @rownum1 int – 未添加訂單的空房數 declare @rownum2 int – 添加訂單的空房數目 declare @BookID1 int set @BookID1=0 insert into T_BookRoomInfo(RoomID,CustomerName,CustomerCardID,Discount, EnterTime,DepositMoney,Memo,UserID,UpdTime) values (@RoomID,@CustomerName,@CustomerCardID,@Discount, getdate(),@DepositMoney,@Memo,@UserID,getdate()) select @BookID1=@@IDENTITY if(@BookID1 0) begin select @rownum1=count(1) from T_Room where IsEmploy=0 update T_Room set IsEmploy=1 where RoomID=@RoomID select @rownum1=count(1) from T_Room where IsEmploy=0
if(@rownum1 =@rownum2) begin rollback tran end else begin commit tran end end else begin rollback tran end
關于 MySQL 事務的介紹以及示例分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。