T-SQL语法分类
1)行锁(隐式锁)
加锁 -> INSERT 、UPDATE 、DELETE
解锁 -> COMMIT 、ROLLBACK
注意 -> MySQL默认为自动提交事务
说明:行级锁可以他人进行读操作,不能进行修改删除操作。同一张表的不同行之间的锁互不相关。
2)表锁(显示锁)
读锁 -> LOCK TBALE 表 READ -> 并发读 (共享锁 多个会话可以对同一表加多个读锁)
写锁 -> LOCK TBALE 表 WRITE -> 完全独占 (排它锁 只能有一把锁)
解锁 -> UNLOCK TBALES
说明:表级锁性能消耗比较小,效率低。
3)死锁 -> MySQL数据库本身对死锁有自我处理机制
Deadlock found when trying to get lock; try restarting transaction
行锁 有可能发生死锁 遇到锁会等待
表锁 不会发生死锁 遇到锁会撤销
补充:JDK1.8 没有提供死锁的自我处理机制
代码实现效果:
public class ThreadA implements Runnable{
private Object object1;
private Object object2;
public ThreadA(Object object1, Object object2) {
this.object1 = object1;
this.object2 = object2;
}
@Override
public void run() {
try {
synchronized (object1){
System.out.println("ThreadA拿到了object1");
Thread.sleep(2000);
synchronized(object2){
System.out.println("ThreadA拿到了object2");
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public class ThreadB implements Runnable{
private Object object1;
private Object object2;
public ThreadB(Object object1, Object object2) {
this.object1 = object1;
this.object2 = object2;
}
@Override
public void run() {
try {
synchronized (object2){
System.out.println("ThreadB拿到了object2");
Thread.sleep(2000);
synchronized(object1){
System.out.println("ThreadB拿到了object1");
}
}
}catch (Exception e){
e.printStackTrace();
}
}
}
public class app {
//死锁的产生
public static void main(String[] args) {
Object object1=new Object();
Object object2=new Object();
new Thread(new ThreadA(object1,object2)).start();
new Thread(new ThreadB(object1,object2)).start();
}
}
程序卡死了,这就是死锁现在。