天天看點

資料庫之mysql與oracle比較

資料庫之mysql與oracle比較

    • 1. 比較
    • 2. 行級鎖
    • 3. 悲觀鎖與樂觀鎖
    • 4. @Transactional注意點

1. 比較

項目 mysql oracle
對事務的送出 自動送出 需要手動送出,commit
事務隔離級别 repeatable-read,可重複讀 read commit, 讀已送出
對事務的支援 在innodb存儲引擎的行級鎖的情況下才可支援事務 完全支援事務
存儲引擎 Innodb(B+樹),myISAM(B+樹), memory 無, B-樹
應用場景 小巧,免費,安裝簡單。集中于網際網路方向 收費,安全性高。 适用于伺服器比較大的單節點或叢集環境,對于可用性,安全性,健壯性,實時性要求極高的業務。大型企業,銀行、金融
單表資料量 單表行數超過 500 萬行或者單表容量超過 2GB,推薦進行分庫分表 推薦是單表500萬

備注:

事務隔離級别為讀送出時,寫資料隻會鎖住相應的行

事務隔離級别為可重複讀時,如果檢索條件有索引(包括主鍵索引)的時候,預設加鎖方式是next-key 鎖;如果檢索條件沒有索引,更新資料時會鎖住整張表。一個間隙被事務加了鎖,其他事務是不能在這個間隙插入記錄的,這樣可以防止幻讀。

2. 行級鎖

mysql行級鎖:

mysql中的行級鎖是由以下sql語句産生:

select * from job_info where id = 1 for update;

主要加上了for update,其中id為主鍵。

如果查詢條件不是主鍵,則會成為表鎖。

3. 悲觀鎖與樂觀鎖

悲觀鎖和樂觀鎖

悲觀鎖雖然能保證資料一緻,可是如果程序從讀取到更新的時間太長,會導緻其他程序等待時間較長,使得系統效率降低。如有重試機制,也可能會耗光資料庫連接配接數。

樂觀鎖,是為資料庫表增加一個辨別資料版本的version字段來實作的,讀取資料時把version字段一同讀出,寫入資料庫時比對version字段就知道資料是否被更改過,如果version不相等就說明持有的是過期資料,不能寫入,如果相等就可以寫入,并把version加一。

4. @Transactional注意點

4.1 不要在接口上聲明@Transactional ,而要在具體類的方法上使用 @Transactional 注解,否則注解可能無效。

4.2 不要圖省事,将@Transactional放置在類級的聲明中,放在類聲明,會使得所有方法都有事務。故@Transactional應該放在方法級别,不需要使用事務的方法,就不要放置事務,比如查詢方法。否則對性能是有影響的。

4.3 使用了@Transactional的方法,對同一個類裡面的方法調用, @Transactional無效。比如有一個類Test,它的一個方法A,A再調用Test本類的方法B(不管B是否public還是private),但A沒有聲明注解事務,而B有。則外部調用A之後,B的事務是不會起作用的。(經常在這裡出錯)

4.4 使用了@Transactional的方法,隻能是public,@Transactional注解的方法都是被外部其他類調用才有效,故隻能是public。道理和上面的有關聯。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也 不會報錯,但事務無效。