作者回复: 数据库基础非常扎实,赞
作者回复: 对的
作者回复: 好的,后面安排
作者回复: 文中解释了怎么实现了数据库的事务隔离级别,那就是通过锁来实现的,Spring的封装只是使用了 MySQL提供的标准接口,只要在设置transaction的时候设置事务隔离级别。
如果不想影响不同业务相互之间的性能,可以通过拆库实现。
作者回复: 可以阅读一些基础入门的书籍,也是作者已经消化梳理过了的,会比较通俗易懂。
作者回复: 粗略看好像没什么问题,但仔细看就能看出问题了。
事务A存在读和改两个操作,事务B也同样存在读和改两个操作。事务A在读时,由于是共享锁,事务B也能读到该数据,当事务A进行修改就需要上排他锁了,此时事务B由于已经对该数据加了共享锁,事务A需要等待事务B释放共享锁才能获取排他锁来修改数据。同样事务B也在等待事务A释放共享锁。这种操作会导致死锁的出现。
我们一般用一个读的事务操作和一个读写事务操作来理解RR事务隔离级别。
作者回复: 这里的索引在update也会使用到
作者回复: 可以设置全局,也可以对当前session设置,不能对单个表进行设置。
作者回复: 先通过SELECT @@tx_isolation;查询下数据库的隔离级别是否为REPEATABLE-READ,然后再按照以下步骤操作:
1、分表开启A、B两个客户端,并在两个客户端开启事务:
mysql> start transaction;
2、并在两个客户端执行以下sql:
mysql> select * from `order` where id=1;
3、在B客户端执行以下sql,但不提交事务
mysql> update `order` set status = 2 where id =1;
4、此时在A客户端查询该值,此时你会发现值没有变
mysql> select * from `order` where id = 1;
5、提交事务客户端B的事务,再次查询A中的值,此时你会发现仍然没有变
mysql>commit;
mysql> select * from `order` where id = 1;
6、提交客户端A中的事务,再次查询A,B的值,此时发生了变更
mysql>commit;
mysql> select * from `order` where id = 1;
mysql> select * from `order` where id = 1;
可以按照以上步骤理解。
作者回复: 这里是针对库存表的锁资源
作者回复: 这对于普通的select操作是不加锁的,不论事务隔离级别。
作者回复: 检查下自己的代码以及隔离级别
作者回复: 在40讲中,讲到了redo log的工作原理,redo log 又包括了内存中的日志缓冲(redo log buffer)以及保存在磁盘的重做日志文件(redo log file),前者存储在内存中,容易丢失,后者持久化在磁盘中,不会丢失。
MySQL支持用户自定义在commit时如何将log buffer中的日志刷log file中。这种控制通过变量 innodb_flush_log_at_trx_commit 的值来决定。该变量有3种值:0、1、2,默认为1,即每提交一次事务都写到磁盘中,而设置为0时,为每秒将事务写到磁盘中。
作者回复: 收到建议
作者回复: 事务B读取数据加了共享锁,修改数据时加了排它锁
作者回复: 是的
作者回复: 是的
作者回复: 也是行锁
作者回复: 这是RR下使用的间隙锁,所以不会出现幻读
作者回复: 两者实际上是一回事,Spring的事务也是基于数据库事务封装的方法。