cremeb多商户打包代码的时候,总是重复的工作,就想着写了个脚本,记录一下sh脚本用到的一下方法:
点击了解 CRMEB多商户 其他开源项目源码 :了解更多
小姐姐二维码
一. 事务并发处理可能出现的问题
- 脏读:读到了其他事务还没有提交的数据;
- 不可重复读:对某个数据进行读取,发现了两次读取的结果不一致,因为前后读的时候其他事务对该信息做了修改;
- 幻读:事务A根据条件查询了N条数据,然后事物B对这些增加或X条符合事物A查询条件的数据,或者修改了X条符合事物A的查询条件的数据,导致事务A再次查询的时候会变成了N+X条数据。
二. 隔离级别
- 读未提交:允许读到其他事务未提交的数据,这种查询不会使用锁,可能会产生脏读,不可重复读、幻读等情况;
- 读已提交:只能读到已经提交的数据,可以避免脏读,如果需要避免不可重复读或者幻读要在sql中加锁;
- 可重复读:mysql中默认的级别,保证一个事务在相同条件下查询的结果是一致的,无法避免幻读。
- 可串行化:将事务进行串行化,也就是在一个队列中按照顺序执行,可串行化是最高的隔离级别,可以解决事务读取中所有可能出现的问题,但没有并发了。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交(READ UNCOMMITTED) | 允许 | 允许 | 允许 |
读已提交(READ COMMITTED) | 禁止 | 允许 | 允许 |
可重复读(REPEATABLE READ) | 禁止 | 禁止 | 允许 |
可串行化(SERIALIZABLE) | 禁止 | 禁止 | 禁止 |
三. 级别操作命令
- 查看当前隔离级别
SHOW VARIABLES LIKE 'transaction_isolationi';
,要大写; - 修改隔离
SET SESSION TRANSACTION ISOLATION LEVE ****
,***就是你需要修改的级别,上表中有对应; - 修改事务是否自动提交
SET autocommit = 0
,1 自动提交,0 不自动提交。
四. 并发异常的例子
脏读(重点是读到的不是最新)
- 设置隔离级别为最低的读未提交;
mysql> SHOW VARIABLES LIKE 'transaction_isolation'; +-----------------------+-----------------+ | Variable_name | Value | +-----------------------+-----------------+ | transaction_isolation | REPEATABLE-READ | +-----------------------+-----------------+ 1 row in set (0.00 sec) mysql> SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; Query OK, 0 rows affected (0.00 sec) mysql> SHOW VARIABLES LIKE 'transaction_isolation'; +-----------------------+------------------+ | Variable_name | Value | +-----------------------+------------------+ | transaction_isolation | READ-UNCOMMITTED | +-----------------------+------------------+ 1 row in set (0.00 sec)
- 执行入库操作,但是不提交事务;
mysql> begin; Query OK, 0 rows affected (0.00 sec) mysql> insert into user(name,age) value('尼古拉-赵四',20); Query OK, 1 row affected (0.00 sec) mysql>
- 打开新的终端,修改隔离级别,并查询,可以查询到入库操作的数据,上面的图形化工具中没有显示这条数据; 记得将事务提交或回滚避免锁死。
不可重复读 (重点是修改)
- 调整隔离级别
- 在左边终端开启事物,右边终端开启事务查询;
- 在左边事务进行修改操作提交,然后左边查询已经和第一次不一致了
幻读 (重点在于新增或者删除)
- 查询所有数据只有4条;
- 另一个终端开始插入数据;
- 在次查询前一个终端,发现是5条数据
基本理解如此