1. 程式人生 > >mysql 行級鎖的使用

mysql 行級鎖的使用

package com.hacker.jdbc.transactional;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import com.hacker.jdbc.Connecter;

public class ThreadMain {
	public static void main(String args[]) {
		//t1執行緒
		Thread t1 = new Thread(() ->{
			Connection con = Connecter.getConnecion();		//connection連線的程式碼就不提供了注意不要使用單例
			conn.setAutoCommit(false); // 預設不提交事務 方便看到阻塞結果
			try {
				System.out.println("t1執行緒試圖開啟行級鎖");
				String sql = "select * from users where id = ? LOCK IN SHARE MODE";// 排他鎖測試換FOR UPDATE
				PreparedStatement pst = con.prepareStatement(sql);
				pst.setInt(1, 1);
				ResultSet rs = pst.executeQuery();
				if(rs.next()){
					System.out.println("t1 :" + rs.getString(2)); //根據你自己定義的表獲取結果
				}
				try {
					System.out.println("t1開始等待3s");	//等待
					synchronized (con) {
						con.wait(3000);
					}
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				System.out.println("t1執行緒完成行級鎖");
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		});
		//用於測試在t1獲得鎖的情況下嘗試 獲取被鎖或修改被鎖行
		Thread t2 = new Thread(() -> {
			Connection con = Connecter.getConnecion();
			try {
				System.out.println("執行緒t2開始試圖獲取被鎖行");
//				String sql = "update users set password = ? where username = 1 ";
				String sql = "select * from users where username = ? LOCK IN SHARE MODE";
				PreparedStatement pst = con.prepareStatement(sql);
//				pst.setString(2, "4566");
				pst.setInt(1, 1);
//				System.out.println(pst.executeUpdate());
				ResultSet rs = pst.executeQuery();
				if(rs.next()){
					System.out.println("t2 :" + rs.getString(2));
				}
				con.commit();
				System.out.println("t2執行緒完成,獲取到被鎖行");
//				con.rollback();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		});
		t1.start();
		t2.start();
		
	}
}


相關推薦

mysql 的使用

package com.hacker.jdbc.transactional; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLExcept

[MySQL] SELECT ... LOCK IN SHARE MODE 和 SELECT ... FOR UPDATE

一、譯文 If you query data and then insert or update related data within the same transaction, the regular SELECT statement does not

你真的會用mysql嗎?mysql 全解析

  在網際網路大併發應用大行其道的今天,應用的開發總是離不開鎖,在分散式應用中,最常見的莫過於基於資料庫的行級鎖了,由於網際網路公司中比較主流的資料庫還是mysql,所以這一話題繞不開的就是mysql了,但是由於mysql中innoDb引擎特殊的機制,經常一不小心就會發生死鎖,本次咱們就來聊一聊基於mysql

MySQL的用法之

數據 更新 能夠 使用 date 技術 adding strong 一個 行級鎖是MySQL中粒度最小的一種鎖,他能大大減少數據庫操作的沖突。但是粒度越小,實現的成本也越高。MYISAM引擎只支持表級鎖,而INNODB引擎能夠支持行級鎖,下面的內容也是針對INNOD

MySQL中的,表,頁

In 回退 常用 info 部分 title 一個 相關 鍵值 轉載:https://blog.csdn.net/zp522123428/article/details/75413745##s4 在計算機科學中,鎖是在執行多線程時用於強行限制資源訪問的同步機制,即用於在並發

MySQL中的、表、頁

常用 一點 存儲引擎 rac 鎖定 方法 線程 加鎖 計算機      在計算機科學中,鎖是在執行多線程時用於強行限制資源訪問的同步機制,即用於在並發控制中保證對互斥要求的滿足。   在DBMS中,可以按照鎖的粒度把數據庫鎖分為行級鎖(INNODB引擎)、表級鎖(MYISA

MySQL、頁詳細介紹

MySQL的鎖機制比較簡單,其最顯著的特點是不同的儲存引擎支援不同的鎖機制。 MyISAM和MEMORY儲存引擎採用的是表級鎖(table-level-locking); BDB儲存引擎採用的是頁面鎖(page-level-locking),同時也支援表級鎖; InnoDB儲存引擎既支援

MySQL中的,表,頁

在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。 在DBMS中,可以按照鎖的粒度把資料庫鎖分為行級鎖(INNODB引擎)、表級鎖(MYISAM引擎)和頁級鎖(BDB引擎 )。 行級鎖 行級鎖是Mysql中鎖定粒度最細的一種

如何理解資料庫MySQL的表、頁問題?

從鎖的粒度進行對資料庫進行劃分等級 表級鎖 行級鎖 頁級鎖(這個不常用) (1)MySQL的表級鎖兩種模式: 1. 表級共享讀鎖(共享鎖): 也就是在MyISAM引擎下,如果對一個表加了讀鎖的話,那

MySQL 中的、表和頁(不看後悔,看了必懂)

行級鎖 行級鎖是 MySQL 中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加鎖。行級鎖分為共享鎖和排他鎖。 特點:加鎖開銷大,會出現死鎖,鎖定粒度最小,發生鎖衝突的概率最低,併發度最高 頁級鎖 頁級鎖是 MySQL 中鎖定粒度介於行級鎖和表級鎖中間的一種鎖。

詳述 MySQL 中的、表和頁

在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。 在資料庫的鎖機制中,咱們介紹過在 DBMS 中,可以按照鎖的粒度把資料庫鎖分為行級鎖(InnoDB 引擎)、表級鎖(MyISAM 引擎)和頁級鎖(BDB

mysql機制之

鎖是在執行多執行緒時用於強行限定資源訪問的同步機制,資料庫鎖根據鎖的粒度可分為行級鎖,表級鎖和頁級鎖行級鎖行級鎖是mysql中粒度最細的一種鎖機制,表示只對當前所操作的行進行加鎖,行級鎖發生衝突的概率很低,其粒度最小,但是加鎖的代價最大。行級鎖分為共享鎖和排他鎖。特點:開銷大

mysql 實驗論證 innodb表

innodb 的行鎖是在有索引的情況下,沒有索引的表是鎖定全表的. 表鎖演示(無索引) 操作1 操作2 處於等待狀

Mysql與表

在電腦科學中,鎖是在執行多執行緒時用於強行限制資源訪問的同步機制,即用於在併發控制中保證對互斥要求的滿足。 在DBMS中,可以按照鎖的粒度把資料庫鎖分為行級鎖(INNODB引擎)、表級鎖(MYISAM引擎和INNODB儲存引擎)。 行級鎖 行級鎖是Mysql中鎖定粒度最細的一種鎖,表示只針對當前操作的行進行加

mysql:如何解決資料修改衝突(事務+的實際運用)

摘要:最近做一個接診需求遇到一個問題,假設一個訂單諮詢超過3次就不能再接診,但如果兩個醫生同時對該訂單進行諮詢,查資料庫的時候都能查到滿足條件的該訂單,那兩個醫生都能接診,所謂接診可以理解為更新了接診次數,此時就出現了bug(接診超過3次)。 其實這個問題看似很明朗,但想要完全解決需要理解事務和鎖的概念,以前

oracle

Oracle有許多的鎖,各種鎖的效用是不一樣的。下面重點介紹Oracle行級鎖,Oracle行級鎖只對使用者正在訪問的行進行鎖定。可以更好的保證資料的安全性,需要的朋友可以瞭解下 Oracle有許多的鎖,各種鎖的效用是不一樣的。下面重點介紹Oracle行級鎖,Oracle行級鎖只對使用者正在訪問

sql server,排它,共享的使用

鎖的概述 一. 為什麼要引入鎖 多個使用者同時對資料庫的併發操作時會帶來以下資料不一致的問題: 丟失更新 A,B兩個使用者讀同一資料並進行修改,其中一個使用者的修改結果破壞了另一個修改的結果,比如訂票系統 髒讀 A使用者修改了資料,隨後B使用者又讀出該資料,但A使用者因為某些原因取消了對資

悲觀、樂觀、表 悲觀、樂觀、表

轉載自:http://www.cnblogs.com/xhybk/p/9278684.html 悲觀鎖、樂觀鎖、行級鎖、表級鎖   更新丟失:新改的覆蓋先改的,開發中有三種方法解決 1、將事務級別提高到最高級別TRANSACT

悲觀、樂觀、表

樂觀 主鍵 gpo gravity money fcm 級別 ble The 悲觀鎖、樂觀鎖、行級鎖、表級鎖 更新丟失:新改的覆蓋先改的,開發中有三種方法解決 1、將事務級別提高到最高級別TRANSACTION_SERIALIZABLE 操作雙方都要提升級別;

初步認識

行級鎖是MySQL中粒度最小的一種鎖,他能大大減少資料庫操作的衝突。但是粒度越小,實現的成本也越高。MYISAM引擎只支援表級鎖,而INNODB引擎能夠支援行級鎖,下面的內容也是針對INNODB行級鎖展開的。 INNODB的行級鎖有共享鎖(S LOCK)和排他鎖(X LOCK)兩種。共享鎖允