就是不可重复读。
3、幻读
所谓幻读,就是指在一个事务里面的操作中发现了未被操作的数据。比如学生信息,事务A开启事务-->修改所有学生当天签到状况为false,此时切换到事务B,事务B开启事务-->事务B插入了一条学生数据,此时切换回事务A,事务A提交的时候发现了一条自己没有修改过的数据,这就是幻读,就好像发生了幻觉一样。幻读出现的前提是并发的事务中有事务发生了插入、删除操作。
通过一下sql可以查出数据库的事务隔离级别:
执行结果:数据库的默认隔离级别
接下来测试一下数据库的事务隔离级别:
首先在product表中添加一个count字段
并且将阿迪达斯的数量设置为50,模拟用户抢购。
1 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED
2
3 BEGIN;SET AUTOCOMMIT = 0;SELECT count FROM product where productId = 2;
4
5 SELECT count FROM product where productId = 2;
6
7 UPDATE product SET count = 49 WHERE productId= 2;
使用for update非常耗费资源,使用乐观锁更节省资源。
乐观锁的使用:
1 SELECT count FROM product WHERE productId = 2;
2 UPDATE product SET count = 47 WHERE productId = 2 AND count = 48;
如果返回0行就代表失败,就会返回用户够买失败。读取数据,记录Timestamp,需要自己加一个Timestamp.
检查和提交要在同一行中执行。
乐观锁的应用场景:买家不是很多,不会造成很多冲突用乐观锁非常好,冲突多的时候要用,很可能count存在服务器内存当中(分布式锁),因为数据库在硬盘当中非常慢。
7. 数据库例题
下列方法中,哪个不可以用来程序调优。 B
A、改善数据访问方式以提升缓存命中率
B、使用多线程的方式提高I/O密集型操作的效率(I/O密集型访问,多线程效果并不太起作用)
C、利用数据库连接池替代直接的数据库访问
D、使用迭代替代递归
E、合并多个线程调用批量发送(减少等待时间)
F、共享冗余数据提高访问效率
|