问题:当A服务器开启事务时,未提交。B事务无法修改数据库的内容,只能查看,能读不能写。
一、并发访问问题----由隔离性引起
如果不考虑隔离性,事务存在3中并发访问问题。
1)脏读:B事务读取到了A事务尚未提交的数据 ------ 要求B事务要读取A事 务提交的数据。mysql的四个隔离级别中,只有“读未提交read uncommitted”会出现你说的情况,剩下三个隔离级别在本session中都不能看到其它session未提交的事务
2)不可重复读:一个事务中 两次读取的数据的内容不一致 ----- 要求的是一个事 务中多次读取时数据是一致的 --- unpdate
3)幻读/虚读:一个事务中 两次读取的数据的数量不一致 ----- 要求在一个事务多 次读取的数据的数量是一致的 --insert delete
2.事务的隔离级别
事务的建立 先后 影响很大
1)read uncommitted : 读取尚未提交的数据 :哪个问题都不能解决
2)read committed:读取已经提交的数据 :可以解决脏读 ---- oracle默认的
3)repeatable read:重读读取:可以解决脏读 和 不可重复读 ---mysql默认的
(相当于我在银行取钱,查看账户还有1000,突然我女朋友在淘宝买衣服转账了500,等我取钱,显示余额不足)
4)serializable:序列化:可以解决 脏读 不可重复读 和 虚读---相当于锁表
设置mysql的隔离级别:set session transaction isolation level 设置事务隔离级别 | |
注意:mysql数据库默认的隔离级别 :repeatable read
mysql语句:
设置事务隔离级别: set session transaction isolation level read uncommitted;
查看mysql数据库默认的隔离级别:select @@tx_isolation;
开启一个事务:start transaction;
举例理解:
脏读:A B服务器设为 read uncommitted
我第一个服务器未提交,但是这第二个服务器能够看到 我未提交的数据,即为脏读。
一旦我设置为read committed 就不会出现这种情况。A服务器即使没有提交,B服务器也看不到未提交的内容。
隔离级别的性能:
read uncommitted>read committed>repeatable read>serialazable
安全性
read uncommitted<read committed<repeatable read<serialazable