① 解釋什麼是隔離級別,以db2為例,資料庫提供了哪幾種隔離級別每種隔離級別都避
1.查看當前會話隔離級別
select @@tx_isolation;
2.查看系統當前隔離級別
select @@global.tx_isolation;
3.設置當前會話隔離級別
set session transaction isolatin level repeatable read;
4.設置系統當前隔離級別
set global transaction isolation level repeatable read;
5.命令行,開始事務時
set autocommit=off 或者 start transaction
關於隔離級別的理解
1.read uncommitted
可以看到未提交的數據(臟讀),舉個例子:別人說的話你都相信了,但是可能他只是說說,並不實際做。
2.read committed
讀取提交的數據。但是,可能多次讀取的數據結果不一致(不可重復讀,幻讀)。用讀寫的觀點就是:讀取的行數據,可以寫。
3.repeatable read(MySQL默認隔離級別)
可以重復讀取,但有幻讀。讀寫觀點:讀取的數據行不可寫,但是可以往表中新增數據。在MySQL中,其他事務新增的數據,看不到,不會產生幻讀。採用多版本並發控制(MVCC)機制解決幻讀問題。
4.serializable
可讀,不可寫。像java中的鎖,寫數據必須等待另一個事務結束。
② java中的Connection是什麼,有哪些方法 每個方法的返回值是什麼意思
這個東西是java api中提供的一個介面,他的實現類由其他廠商完成,用於與資料庫的鏈接
void clearWarnings()
清除為此 Connection 對象報告的所有警告。
void close()
立即釋放此 Connection 對象的資料庫和 JDBC 資源,而不是等待它們被自動釋放。
void commit()
使自從上一次提交/回滾以來進行的所有更改成為持久更改,並釋放此 Connection 對象當前保存的所有資料庫鎖定。
Statement createStatement()
創建一個 Statement 對象來將 SQL 語句發送到資料庫。
Statement createStatement(int resultSetType, int resultSetConcurrency)
創建一個 Statement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
創建一個 Statement 對象,該對象將生成具有給定類型、並發性和可保存性的 ResultSet 對象。
boolean getAutoCommit()
檢索此 Connection 對象的當前自動提交模式。
String getCatalog()
檢索此 Connection 對象的當前目錄名稱。
int getHoldability()
檢索使用此 Connection 對象創建的 ResultSet 對象的當前可保存性。
DatabaseMetaData getMetaData()
獲取 DatabaseMetaData 對象,該對象包含關於 Connection 對象連接到的資料庫的元數據。
int getTransactionIsolation()
檢索此 Connection 對象的當前事務隔離級別。
Map<String,Class<?>> getTypeMap()
將給定的 TypeMap 對象安裝為此 Connection 對象的類型映射表。
SQLWarning getWarnings()
檢索此 Connection 對象上的調用報告的第一個警告。
boolean isClosed()
檢索此 Connection 對象是否已經被關閉。
boolean isReadOnly()
檢索此 Connection 對象是否處於只讀模式。
String nativeSQL(String sql)
將給定的 SQL 語句轉換成系統本機 SQL 語法。
CallableStatement prepareCall(String sql)
創建一個 CallableStatement 對象來調用資料庫存儲過程。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency)
創建一個 CallableStatement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
創建一個 CallableStatement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
PreparedStatement prepareStatement(String sql)
創建一個 PreparedStatement 對象來將參數化的 SQL 語句發送到資料庫。
PreparedStatement prepareStatement(String sql, int autoGeneratedKeys)
創建一個默認 PreparedStatement 對象,該對象能檢索自動生成的鍵。
PreparedStatement prepareStatement(String sql, int[] columnIndexes)
創建一個能夠返回由給定數組指定的自動生成鍵的默認 PreparedStatement 對象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
創建一個 PreparedStatement 對象,該對象將生成具有給定類型和並發性的 ResultSet 對象。
PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability)
創建一個 PreparedStatement 對象,該對象將生成具有給定類型、並發性和可保存性的 ResultSet 對象。
PreparedStatement prepareStatement(String sql, String[] columnNames)
創建一個能夠返回由給定數組指定的自動生成鍵的默認 PreparedStatement 對象。
void releaseSavepoint(Savepoint savepoint)
從當前事務中移除給定 Savepoint 對象。
void rollback()
取消在當前事務中進行的所有更改,並釋放此 Connection 對象當前保存的所有資料庫鎖定。
void rollback(Savepoint savepoint)
取消設置給定 Savepoint 對象之後進行的所有更改。
void setAutoCommit(boolean autoCommit)
將此連接的自動提交模式設置為給定狀態。
void setCatalog(String catalog)
設置給定目錄名稱,以便選擇要在其中進行工作的此 Connection 對象資料庫的子空間。
void setHoldability(int holdability)
將使用此 Connection 對象創建的 ResultSet 對象的可保存性 (holdability) 更改為給定可保存性。
void setReadOnly(boolean readOnly)
將此連接設置為只讀模式,作為驅動程序啟用資料庫優化的提示。
Savepoint setSavepoint()
在當前事務中創建一個未命名的保存點 (savepoint),並返回表示它的新 Savepoint 對象。
Savepoint setSavepoint(String name)
在當前事務中創建一個具有給定名稱的保存點,並返回表示它的新 Savepoint 對象。
void setTransactionIsolation(int level)
試圖將此 Connection 對象的事務隔離級別更改為給定的級別。
void setTypeMap(Map<String,Class<?>> map)
安裝給定的 TypeMap 對象作為此 Connection 對象的特定類型映射。
③ 怎麼查看資料庫隔離級別
修改方法
有兩種方法可以對配置了 systemd 的程序進行資源隔離:1. 命令行修改:通過執行systemctl set-property命令實現,形式為systemctl set-propertyname parameter=value;修改默認即時生效。2. 手工修改文件:直接編輯程序的 systemd unit file 文件,完成之後需手工執行systemctldaemon-reload更新配置,並重啟服務systemctl restart name.service。
systemd unit file 里支持的資源隔離配置項,如常見的:
CPUQuota=value
該參數表示服務可以獲取的最大 CPU 時間,value 為百分數形式,高於 100% 表示可使用1 核以上的CPU。與 cgroup cpu 控制器cpu.cfs_quota_us配置項對應。
MemoryLimit=value
該參數表示服務可以使用的最大內存量,value 可以使用 K, M, G, T 等後綴表示值的大小。與 cgroupmemory 控制器memory.limit_in_bytes配置項對應。
事務的4種隔離級別
READ UNCOMMITTED 未提交讀,可以讀取未提交的數據。
READ COMMITTED 已提交讀,對於鎖定讀(select with for update 或者 for share)、update 和 delete 語句,InnoDB 僅鎖定索引記錄,而不鎖定它們之間的間隙,因此允許在鎖定的記錄旁邊自由插入新記錄。
Gap locking 僅用於外鍵約束檢查和重復鍵檢查。
REPEATABLE READ 可重復讀,事務中的一致性讀取讀取的是事務第一次讀取所建立的快照。
SERIALIZABLE 序列化在了解了 4 種隔離級別的需求後,在採用鎖控制隔離級別的基礎上,我們需要了解加鎖的對象(數據本身&間隙),以及了解整個數據范圍的全集組成。
數據范圍全集組成
SQL 語句根據條件判斷不需要掃描的數據范圍(不加鎖);
SQL 語句根據條件掃描到的可能需要加鎖的數據范圍;
以單個數據范圍為例,數據范圍全集包含:(數據范圍不一定是連續的值,也可能是間隔的值組成)
④ .spring的事務有幾種方式spring事務的隔離級別和傳播行為是什麼
Spring提供了許多內置事務管理器實現,常用的有:
DataSourceTransactionManager(JDBC局部事務);
JtaTransactionManager(JTA全局事務);
HibernateTransactionManager(Hibernate事務)。
一、事務的隔離級別:
資料庫系統提供了4種事務隔離級別,在這4種隔離級別中,Serializable的隔離級別最高,Read Uncommitted的隔離級別最低;
Read Uncommitted:讀未提交數據;(會出現臟讀)
Read Committed:讀已提交數據;
Repeatable Read:可重復讀;
Serializable:串列化。
二、事務的傳播屬性包括:
Required:業務方法需要在一個事務中運行,如果一個方法運行時已經處在一個事務中,那麼加入到該事務,否則為自己創建一個新事務,80%的方法用到該傳播屬性:
Not-Supported
Requiresnew
Mandatoky
Supports
Never
Nested