怎么输出mysql jdbc的默认事务隔离级别

如题所述

  下面,将利用MySQL的客户端程序,分别测试几种隔离级别。测试数据库为test,表为tx;表结构:

  id                                  int

  num

  int

  两个命令行客户端分别为A,B;不断改变A的隔离级别,在B端修改数据。

  (一)、将A的隔离级别设置为read uncommitted(未提交读)

  在B未更新数据之前:

  客户端A:

  B更新数据:

  客户端B:

  客户端A:

  经过上面的实验可以得出结论,事务B更新了一条记录,但是没有提交,此时事务A可以查询出未提交记录。造成脏读现象。未提交读是最低的隔离级别。

  (二)、将客户端A的事务隔离级别设置为read committed(已提交读)

  在B未更新数据之前:

  客户端A:

  B更新数据:

  客户端B:

  客户端A:

  经过上面的实验可以得出结论,已提交读隔离级别解决了脏读的问题,但是出现了不可重复读的问题,即事务A在两次查询的数据不一致,因为在两次查询之间事务B更新了一条数据。已提交读只允许读取已提交的记录,但不要求可重复读。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-11-19

修改方法

有两种方法可以对配置了 systemd 的程序进行资源隔离:1. 命令行修改:通过执行 systemctl set-property 命令实现,形式为 systemctl set-property name parameter=value;修改默认即时生效。2. 手工修改文件:直接编辑程序的 systemd unit file 文件,完成之后需手工执行 systemctl daemon-reload 更新配置,并重启服务 systemctl restart name.service。

systemd unit file 里支持的资源隔离配置项,如常见的:

    CPUQuota=value 

    该参数表示服务可以获取的最大 CPU 时间,value 为百分数形式,高于 100% 表示可使用 1 核以上的 CPU。与 cgroup cpu 控制器 cpu.cfs_quota_us 配置项对应。

    MemoryLimit=value 

    该参数表示服务可以使用的最大内存量,value 可以使用 K, M, G, T 等后缀表示值的大小。与 cgroup memory 控制器 memory.limit_in_bytes 配置项对应。 

    事务的4种隔离级别

    READ UNCOMMITTED       未提交读,可以读取未提交的数据。

    READ COMMITTED         已提交读,对于锁定读(select with for update 或者 for share)、update 和 delete 语句,InnoDB 仅锁定索引记录,而不锁定它们之间的间隙,因此允许在锁定的记录旁边自由插入新记录。                       

    Gap locking 仅用于外键约束检查和重复键检查。

    REPEATABLE READ        可重复读,事务中的一致性读取读取的是事务第一次读取所建立的快照。

    SERIALIZABLE           序列化在了解了 4 种隔离级别的需求后,在采用锁控制隔离级别的基础上,我们需要了解加锁的对象(数据本身&间隙),以及了解整个数据范围的全集组成。

    数据范围全集组成

    SQL 语句根据条件判断不需要扫描的数据范围(不加锁);

    SQL 语句根据条件扫描到的可能需要加锁的数据范围;

    以单个数据范围为例,数据范围全集包含:(数据范围不一定是连续的值,也可能是间隔的值组成)

相似回答