欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

mysql 事務(wù)隔離級(jí)別和傳播機(jī)制

MySQL是常用的開(kāi)源關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),支持事務(wù)處理。在MySQL中,事務(wù)的隔離級(jí)別和傳播機(jī)制對(duì)于數(shù)據(jù)的一致性、并發(fā)性和性能都有很大影響。

MySQL中有四個(gè)事務(wù)隔離級(jí)別,分別為:READ UNCOMMITTED(讀未提交)、READ COMMITTED(讀已提交)、REPEATABLE READ(可重復(fù)讀)和SERIALIZABLE(串行化)。

事務(wù)隔離級(jí)別        臟讀     不可重復(fù)讀   幻讀
READ UNCOMMITTED    可能     可能        可能
READ COMMITTED      不可能   可能        可能
REPEATABLE READ     不可能   不可能      可能
SERIALIZABLE        不可能   不可能      不可能

可以看到,事務(wù)隔離級(jí)別從下往上逐漸提高,對(duì)于臟讀、不可重復(fù)讀和幻讀的問(wèn)題都有不同的處理方式。總的來(lái)說(shuō),隔離級(jí)別越高,安全性越高,但是并發(fā)性越低。

在MySQL中,事務(wù)的傳播機(jī)制有以下幾種類型:

  • PROPAGATION_REQUIRED:默認(rèn)的取值,如果當(dāng)前沒(méi)有事務(wù)存在,則創(chuàng)建一個(gè)新事務(wù)。如果存在一個(gè)事務(wù)中,該方法就加入這個(gè)事務(wù)中執(zhí)行。
  • PROPAGATION_SUPPORTS:支持當(dāng)前事務(wù),如果當(dāng)前存在事務(wù),則加入該事務(wù);如果當(dāng)前沒(méi)有事務(wù),則以非事務(wù)執(zhí)行。
  • PROPAGATION_MANDATORY:強(qiáng)制必須存在一個(gè)事務(wù),如果不存在,則拋出異常。
  • PROPAGATION_REQUIRES_NEW:創(chuàng)建一個(gè)新的事務(wù),如果當(dāng)前存在事務(wù),則掛起該事務(wù)。
  • PROPAGATION_NOT_SUPPORTED:以非事務(wù)方式執(zhí)行操作,如果當(dāng)前存在事務(wù),則掛起該事務(wù)。
  • PROPAGATION_NEVER:以非事務(wù)方式執(zhí)行,如果當(dāng)前存在事務(wù),則拋出異常。
  • PROPAGATION_NESTED:如果一個(gè)活動(dòng)的事務(wù)存在,則運(yùn)行在一個(gè)嵌套的事務(wù)中;如果沒(méi)有活動(dòng)事務(wù),則按 TransactionDefinition.PROPAGATION_REQUIRED 屬性執(zhí)行。
傳播機(jī)制         代碼塊
REQUIRED        void methodA()
throws SQLException {
// Required Transaction
}
void methodB() 
throws SQLException{
// Existing transaction
// Proceeds with existing transaction or creates new. 
}
SUPPORTS        void methodA()
throws SQLException {
// Current transaction / non-transaction
}  
MANDATORY       void methodA()
throws SQLException{
// Existing transaction
// Throws exception if no existing transaction  
}
void methodB() 
throws SQLException{
// Existing transaction
}
REQUIRES_NEW    void methodA()
throws SQLException {
// New transaction
}
void methodB() 
throws SQLException{
// Suspended existing transaction
}
NOT_SUPPORTED   void methodA()
throws SQLException{
// No transaction context
// Suspended existing transaction
}
void methodB() 
throws SQLException{
// No transaction context
}
NEVER           void methodA() 
throws SQLException{
// No transaction context
}
void methodB() 
throws SQLException{
// No transaction context
// Throws exception if ongoing transaction context.
}
NESTED          void methodA()
throws SQLException{
// Existing transaction
// Creates savepoint                 
}
void methodB() 
throws SQLException{
// Existing transaction nested in methodA transaction context.
}

MySQL中的事務(wù)隔離級(jí)別和傳播機(jī)制,對(duì)于開(kāi)發(fā)者來(lái)說(shuō)是兩個(gè)很重要的概念。需要根據(jù)實(shí)際情況,選擇合適的隔離級(jí)別和傳播機(jī)制,以保證數(shù)據(jù)的一致性、并發(fā)性和性能。