首頁技術(shù)文章正文

java基礎(chǔ)-事務(wù)

更新時(shí)間:2018-09-17 來源:黑馬程序員JavaEE培訓(xùn)學(xué)院 瀏覽量:

1. 事務(wù)的基本介紹

        1. 概念:

            *  如果一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作,被事務(wù)管理,那么這些操作要么同時(shí)成功,要么同時(shí)失敗。

            

        2. 操作:

            1. 開啟事務(wù): start transaction;

            2. 回滾:rollback;

            3. 提交:commit;

        3. 例子:

            CREATE TABLE account (

                id INT PRIMARY KEY AUTO_INCREMENT,

                NAME VARCHAR(10),

                balance DOUBLE

            );

            -- 添加數(shù)據(jù)

            INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);

            

            

            SELECT * FROM account;

            UPDATE account SET balance = 1000;

            -- 張三給李四轉(zhuǎn)賬 500 元

            

            -- 0. 開啟事務(wù)

            START TRANSACTION;

            -- 1. 張三賬戶 -500

            

            UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';

            -- 2. 李四賬戶 +500

            -- 出錯(cuò)了...

            UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';

            

            -- 發(fā)現(xiàn)執(zhí)行沒有問題,提交事務(wù)

            COMMIT;

            

            -- 發(fā)現(xiàn)出問題了,回滾事務(wù)

            ROLLBACK;

        4. MySQL數(shù)據(jù)庫中事務(wù)默認(rèn)自動(dòng)提交

            

            * 事務(wù)提交的兩種方式:

                * 自動(dòng)提交:

                    * mysql就是自動(dòng)提交的

                    * 一條DML(增刪改)語句會(huì)自動(dòng)提交一次事務(wù)。

                * 手動(dòng)提交:

                    * Oracle 數(shù)據(jù)庫默認(rèn)是手動(dòng)提交事務(wù)

                    * 需要先開啟事務(wù),再提交

            * 修改事務(wù)的默認(rèn)提交方式:

                * 查看事務(wù)的默認(rèn)提交方式:SELECT @@autocommit; -- 1 代表自動(dòng)提交  0 代表手動(dòng)提交

                * 修改默認(rèn)提交方式: set @@autocommit = 0;



    2. 事務(wù)的四大特征:

        1. 原子性:是不可分割的最小操作單位,要么同時(shí)成功,要么同時(shí)失敗。

        2. 持久性:當(dāng)事務(wù)提交或回滾后,數(shù)據(jù)庫會(huì)持久化的保存數(shù)據(jù)。

        3. 隔離性:多個(gè)事務(wù)之間。相互獨(dú)立。

        4. 一致性:事務(wù)操作前后,數(shù)據(jù)總量不變

    3. 事務(wù)的隔離級(jí)別(了解)

        * 概念:多個(gè)事務(wù)之間隔離的,相互獨(dú)立的。但是如果多個(gè)事務(wù)操作同一批數(shù)據(jù),則會(huì)引發(fā)一些問題,設(shè)置不同的隔離級(jí)別就可以解決這些問題。

        * 存在問題:

            1. 臟讀:一個(gè)事務(wù),讀取到另一個(gè)事務(wù)中沒有提交的數(shù)據(jù)

            2. 不可重復(fù)讀(虛讀):在同一個(gè)事務(wù)中,兩次讀取到的數(shù)據(jù)不一樣。

            3. 幻讀:一個(gè)事務(wù)操作(DML)數(shù)據(jù)表中所有記錄,另一個(gè)事務(wù)添加了一條數(shù)據(jù),則第一個(gè)事務(wù)查詢不到自己的修改。

        * 隔離級(jí)別:

            1. read uncommitted:讀未提交

                * 產(chǎn)生的問題:臟讀、不可重復(fù)讀、幻讀

            2. read committed:讀已提交 (Oracle)

                * 產(chǎn)生的問題:不可重復(fù)讀、幻讀

            3. repeatable read:可重復(fù)讀 (MySQL默認(rèn))

                * 產(chǎn)生的問題:幻讀

            4. serializable:串行化

                * 可以解決所有的問題


            * 注意:隔離級(jí)別從小到大安全性越來越高,但是效率越來越低

            * 數(shù)據(jù)庫查詢隔離級(jí)別:

                * select @@tx_isolation;

            * 數(shù)據(jù)庫設(shè)置隔離級(jí)別:

                * set global transaction isolation level  級(jí)別字符串;


        * 演示:

            set global transaction isolation level read uncommitted;

            start transaction;

            -- 轉(zhuǎn)賬操作

            update account set balance = balance - 500 where id = 1;

            update account set balance = balance + 500 where id = 2;


本文版權(quán)歸黑馬程序員JavaEE學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!

作者:黑馬程序員JavaEE培訓(xùn)學(xué)院

首發(fā):http://java.itheima.com/


分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!