Mysql解决死锁问题
死锁(英语:Deadlock),又译为死结,计算机科学名词。当两个以上的运算单元,双方都在等待对方停止运行,以获取系统资源,但是没有一方提前退出时,就称为死锁。 -- 引用自维基百科。
mysql> select * from user;
+----+------+------+---------+
| id | name | age | address |
+----+------+------+---------+
| 3 | 1 | 26 | 1 |
| 4 | 1 | 1 | 1 |
+----+------+------+---------+
有一张user表,id是主键,那么执行如下操作会造成死锁:
A:
start transaction;
select * from user where id=3 for update;
B:
start transaction;
select * from user where id=4 for update;
A:
select * from user where id=4 for update;
B:
select * from user where id=3 for update;
执行到这里,A、B两个数据库连接都会阻塞。
处理死锁问题:
show processlist # 显示当前DB所有连接信息,如果有连接处于阻塞状态,则会有如下显示
kill id # 杀死对应连接,这样就会释放掉占用的锁
show engine innodb status # 显示索引状态,因为innodb引擎会在索引上进行加锁,执行这条语句会返回引擎的各种信息(比如):
TRANSACTIONS
------------
Trx id counter 69598
Purge done for trx's n:o < 69594 undo n:o < 0 state: running but idle
History list length 1036
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 281479623174360, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 281479623173456, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 281479623170744, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 281479623169840, not started
0 lock struct(s), heap size 1136, 0 row lock(s)
---TRANSACTION 69597, ACTIVE 89 sec
2 lock struct(s), heap size 1136, 1 row lock(s) # 显示该事务锁住一行数据
MySQL thread id 1124, OS thread handle 123145506287616, query id 130081 localhost root cleaning up
--------
Maven 引入本地jar包
<dependency>
<groupId>xxx</groupId>
<artifactId>xxx</artifactId>
<version>1.0</version>
<scope>system</scope>
<systemPath>/.../xxx.jar</systemPath>
</dependency>
这种方法是有缺陷的,仅仅适用于开发阶段,如果使用 maven package 命令不会把该包打入jar中。
这个缺陷有一种比较好的解决方案是参考链接中 Nikita Volkov 回答的方法。
MySql连接问题
给朋友写的脚本要把数据插入MySql数据库,在本地测试插入没有问题;但是在朋友机器上插入之后出现乱码。
配置如下:
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
出现的乱码都是??,所以估计是把UTF-8编码格式当做ISO-8859-1进行编码。
把上述配置修改后插入正常。
spring:
datasource:
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
useUnicode=true&characterEncoding=UTF-8代表使用指定的编码集UTF-8来进行编码。
那么为什么本地没有问题而朋友机器上有问题呢,原因是本地MySql服务器和数据库都是以UTF-8编码的;而朋友机器上仅仅数据库是UTF-8编码的,如果没有指定编码格式数据库会按照默认ISO-8859-1进行编码从而导致乱码。