美文网首页周记
周记 2017 5.8 - 5.14

周记 2017 5.8 - 5.14

作者: 小程有话说 | 来源:发表于2017-05-08 15:15 被阅读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进行编码从而导致乱码。

    相关文章

      网友评论

        本文标题:周记 2017 5.8 - 5.14

        本文链接:https://www.haomeiwen.com/subject/hzgmtxtx.html