老师,模拟银行转账

来源:2-4 事务的隔离级别

优土巴

2020-02-05 21:21:57

http://img.mukewang.com/climg/5e3abdda09deb80d02150089.jpg

数据表如上图

第一步: 开启事务A :  START TRANSACTION;

第二步:开启事务B:    START TRANSACTION;

第三步:事务B执行减去100: 

UPDATE t_money SET money=money-100 WHERE id = 1

第四步:事务A增加1000元:

UPDATE t_money SET money=money+1000 WHERE id = 1;

则会出现:

http://img.mukewang.com/climg/5e3abec809075d2405000102.jpg

在生产环境中,是否也会出现这种错误提示?

如果在生产环境也能出现这种错误提示,能否直接回滚事务A。向客户端提示 转账失败。

然后 提交事务B。金额就变成了 4900。

这样就不需要设置隔离级别了。 这类似的问题在真实的业务上是这样解决吗?








写回答

1回答

时间,

2020-02-06

同学,你好。

Mysql数据库采用InnoDB引擎,默认参数:innodb_lock_wait_timeout设置锁等待的时间是50s,一旦数据库锁超过这个时间就会报错。

两个事务A和事务B,他们两个都存在update 同一条记录,A 先修改,但是没有提交事务,B也想修改但是一直等,直到等到了超过了innodb_lock_wait_timeout所设置的时间,就会报出此异常。

在生产环境中,若出现上述操作也是会有报错的。可以找到对应线程号执行命令kill +线程号即可解决。

如果我的回答解决了您的疑惑,请采纳!祝学习愉快~~~~

0

0 学习 · 2669 问题

查看课程