# 原创,转载请留言联系
事务的隔离级别 (由高到低)
1.串行化(serializable):一个事务一个事务的执行
2.可重复读(Repeatable-Read) 可重复读,无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响 (mysql数据库所默认的级别)
3.读已提交(Read Committed) 读取已提交,其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值(大多数数据库默认的隔离级别)
4.读未提交:(Read Uncommitted) 读取未提交,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。
结合实际流程理解一下:
1.串行化 serializable
串行化就是一个事务一个事务的执行。一个事务未执行完毕,另一个事务不能执行。例如上面的购买商品流程。用户A购买商品时,开始一个事务。在这个事务未执行完的时候,用户B不能开始事务。
2.可重复读 Repeatable-Read
可重复读就是一个事务里,无论查找多少遍,都是一样的结果,即使另一个事务对数据进行了更改,查到的结果也是永远一样。例如,用户A开始了事务,查询商品的库存为3。即使用户B这时候开始事务,然后完成了事务,修改了库存,提交了事务。但是用户A的事务在查询商品的库存永远都是3,并不会因为用户B的事务更改了库存而更新数据。它是独立于一个事务的。Mysql默认的隔离级别就是可重复读。
3.读已提交 Read Committed
读已提交是其他事务提交了对数据的修改后,本事务就能读取到修改后的数据值。
例如,用户A开始了事务,查询商品数据是3。这时候,用户B开始了事务,修改了商品库存为1,并且事务提交了。这时候A的事务再查询库存的时候,库存不再是3了,而是1。
很多数据库的默认隔离级别都是读已提交。
4.读未提交 Read Uncommitted
读未提交是其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。例如,用户A开始了事务,查询商品库存是3。这时候用户B开始了事务,先修改了商品库存为1,但是还没有提交。即使这样,用户A的事务再查询商品库存时,查到的库存也是1。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在用乐观锁的时候,必须要把mysql的隔离级别设置为读已提交。
Ubuntu下的设置方法:
方式一:
1. 使用vi打开mysql配置文件
sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf
2. 在文件的最末尾添加如下配置, 指定mysql数据库的隔离级别为READ-COMMITTED,如下图
# 可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
transaction-isolation=READ-COMMITTED
3. 在终端中重启mysql服务
sudo service mysql restart
方式二:
1. 进入mysql终端
2. 查看当前事务隔离级别
select @@global.tx_isolation;
3. 设置隔离级别,可选的参数READ UNCOMMITTED | REPEATABLE READ | SERIALIZABLE
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;