Mysql事务实战
前言 Mysql的事务机制,各类书籍博客上都讲了很多,八股文也基本都有,但是我属于不实践都搞不懂的笨蛋,所有本文来通过实践理解mysql的四个事务级别。 mysql安装(已经安装的可以跳过) 首先安装mysql,我使用的是Mac,安装mysql很简单。 brew install mysql 接着执行 brew services start mysql启动mysql 因为只是在本地测试,直接使用mysql -u root登录就可以 本文的目的是想要实践mysql的事务,为了更加直观的操作,所以不使用额外的客户端操作mysql,但是直接使用终端比较麻烦,所以我推荐安装mycli 在Mac上的安装也很简单,brew install mycli 这时就可以使用mycli -u root连接mysql了 测试数据准备 本文的测试数据使用官方的测试数据集, 按照readme文档,设置数据就好。 开始研究 首先执行select * from employees limit 10;看一下有那些数据。 ANSI SQL标准定义了4种隔离级别。 READ UNCOMMITTED READ COMMITTED REPEATABLE READ SERIALIZABLE READ UNCOMMITTED 如其名所描述,这种数据库隔离级别的特征肯定是读到uncommitted的数据。首先我们打开不同的终端,开启两个数据库连接。在两个数据库终端中设置当前会话的事务提交类型为READ UNCOMMITTED SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 接着在两个数据库连接中都开启事务 start transaction; 首先,我们在两个事务中都查询一下编号为10002的员工的性别。 select * from employees where emp_no = '10002'; 打开第三个终端,查询当前事务的状态。 SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX\G 当前,有两个事务,分别是281479414878104和28147941487731,他们的事务级别也都是READ UNCOMMITTE,值得注意的是trx_weight这个字段。InnoDB目前处理死锁的方式是将持有最少行级排他锁的事务回滚。为了解决死锁,InnoDB 选择一个小的权重的事务来回滚。...