周记

周记 2017 5.8 - 5.14

2017-05-08  本文已影响7人  小程有话说

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进行编码从而导致乱码。

上一篇下一篇

猜你喜欢

热点阅读