MySQL的伪事务

书接上文
在MySQL中MyISAM类型表不能支持事务的处理,用户可以选择应用表锁来代替事务。这种引用表锁定来代替事务的事件被称为伪事务。使用表锁定来锁定表的操作可以加强非事务表在执行过程的安全性和稳定性。

用表锁定代替事务

在MySQL的MyISAM类型表中是不支持COMMIT,和ROLLBACK命令,对数据库执行插入,更新,删除时会立刻被保存到磁盘中,在多用户的环境中这样的操作会导致诸多问题,为了避免同一时间有多个用户对数据库的指定表进行操作,就可以应用表锁来避免在用户操作数据表的过程中收到干扰。当且仅当该用户释放表的操作锁定后,其他用户才可以访问这些修改后的数据表。
1.为指定数据表添加锁定

LOCK TABLES tb_name lock_type[,tb_name,lock_type,...];
其中tb_name为表的名字,lock_type为锁定类型(READ(读方式)/WRITE(写方式))

2.用户执行数据表的操作(添加,更改,删除)
3.完成锁定表的操作后,解锁该表

UNLOCK TABLES;
以读方式锁定数据表

以读方式锁定数据表,是设置锁定用户的其他操作方式,如删除,插入,更新都不被允许。其他用户也只能读取,不能其他操作。如果要进行其他的操作则执行锁定的用户必须执行解锁操作

锁定表的主用户A
mysql> LOCK TABLES student READ; 以读方式锁定数据表
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student; 查询数据表
+------+
| name |
+------+
| wang |
+------+
1 row in set (0.00 sec)

mysql> INSERT student VALUES('he'); 向数据表插入记录失败
ERROR 1099 (HY000): Table 'student' was locked with a READ lock and can't be updated
mysql>
操作表的用户B
mysql> USE love;
Database changed
mysql> SELECT * FROM student;
+------+
| name |
+------+
| wang |
+------+
1 row in set (0.01 sec)

mysql> INSERT student VALUES('ha');
ERROR 1099 (HY000): Table 'student' was locked with a READ lock and can't be updated

说明:在上面的代码中当用户A锁定表后,B用户可以查询表,但是不能插入记录,当用户B在写完INSERT语句后按Enter键后,会弹出错误信息

以写方式锁定数据表

表的写锁定时设置用户可以修改表中的数据,但是除自己以外的其他用户不能进行任何读操作

主用户A锁定
mysql> LOCK TABLES student WRITE;  以读方式锁定表
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM student;  可以查询表
+------+
| name |
+------+
| wang |
| ha   |
+------+
2 rows in set (0.00 sec)

mysql> INSERT student VALUES('zhang');  可以插入数据
Query OK, 1 row affected (0.00 sec)

mysql> UPDATE student SET name='he' WHERE name='ha'; 可以修改数据
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
用户B的操作
mysql> SELECT * FROM student;
_

mysql> INSERT student VALUES('li');
_

说明:在主用户A没有解锁的情况下,用户B向student表中插入数据,按Enter键后一直处于等待状态没有任何显示,只有主用户A解锁表后B用户的SQL语句会立即显示执行的结果(正确插入还是语法错误),查询也是一样的

注意:这张表的引擎为MyISAM

MySQL的insert死锁问题是指在并发插入数据时,多个事务之间发生了死锁导致其中一个事务失败的情况。根据引用和引用的描述,当事务2和事务3同时尝试插入数据时,如果它们操作的数据行有冲突(例如主键冲突),那么其中一个事务会先获取到锁,而另一个事务必须等待锁的释放。如果此时事务1又提交了,并且事务2和事务3之间的插入顺序不一致,就可能会发生死锁。 具体来说,如果事务1先插入了一条数据,然后事务2和事务3同时试图插入冲突的数据,例如相同的主键,那么其中一个事务会被阻塞。而当事务1提交后,事务2和事务3之间的插入顺序不一致时,就会发生死锁。这是因为事务2和事务3之间的插入顺序不一致导致了互相的等待,无法解开死锁。 为了解决这个问题,可以考虑以下几种方案: 1. 确保事务2和事务3之间的插入顺序一致,避免死锁的发生。 2. 使用合适的索引来减少锁的冲突,例如在插入数据时使用更细粒度的锁。 3. 调整事务的隔离级别,使用更高级别的隔离级别可以减少死锁的可能性,但也可能导致并发性能下降。 4. 使用数据库的锁机制和事务控制语句,例如使用事务的隔离级别、锁定表或行等来避免死锁的发生。 总之,MySQL的insert死锁问题可以通过合理的设计和调整来避免或减少发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值