資料庫之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 注解,它也 不會報錯,但事務無效。