一个普通的select语句(不带锁模式)在uncommit read模式下,读到的是未提交的数据在commit read模式下,读到未提交的数据但是同由于这个查询不会等待另一个修改事务的结束,因此读到的都是错误数据,除非select ... lock in xxx,才能等待另一个事务的结束select ... lock in xxx不放在事务里,同样也可以等待另一事务的结束那设置这个隔离级别还有什么意思呢?
t1:begin;
delete from t1 where id > 6;
t2:begin;
select * from t1 where id > 6;在除顺序读之外的三个级别下,读到的数据都是不正确的
t1:begin;
delete from t1 where id > 6;
t2:begin;
select * from t1 where id > 6;在除顺序读之外的三个级别下,读到的数据都是不正确的
解决方案 »
- MySQL replication配置问题
- mysql blob 字段下载下来后都是40K
- windows下postgresql创建自定义C函数的问题
- 大家如何估算自己数据库(mysql)的响应时间?
- 关于mysql求交集
- 请问如何实施监控JDBC与mysql的连接?
- 问大家一个闭着眼睛都能回答的问题,如果连接两个没有相同列的表,来者有分,呵呵
- 请问这个简单的SQL语句怎样写?
- 请看我这个删除语句的句法为什么出错???
- 使用Latin1字符集写入中文报错
- mysql存储过程里怎么循环一张表
- create table `message`( `id` tinyint(2) no null auto_increment primary key, `use
要避免这种问题,是不是一定要在select中显示的加上锁模式啊
mysql是repeatable read,没什么用
不同的connection中是可以的。不知原因何在,期待大侠解决。。关注。。
那.net连接MySql在同一connection,不同session情况下,支持事务吗?
不知道net, 同一个connection, 不同session,到底是什么样的概念。
对mysql服务端来说,它不管你客户端如何定义,一个连接(说白了就是一个tcp socket)就是一个最小单位, 某一个时刻只能维持一个事务。
是不会读到脏数据,但是也不同样也不会等待另一个修改事务的结束这也不是想要的结果假如一个链接中的事务向一个钱袋加钱,还没有提交,这时另一链接中的事务想要读到最新余额后做一些判断,然后也向这个钱袋加钱在commit read , repeatable read下,另一事务读到的就是第一个事务未修改前的余额,这样就不对了我想第二个事务就一定要等待第一个事务的结束,才能读到正确的余额,这就需要用serial read级别,或者select... lock mode ...才行
(这里不再多描述)
至今还没发现某个数据库声称能符合这个标准,而实际达不到。差异是在,各个数据库的内部机制是如何实现这个标准。对于不是MVCC(多版本控制)的数据库如informix,为了能实现其标准,它只能通过自动加锁的方式。而对于MVCC的数据库如INNODB, postgresql, 根本就不用加锁,就可以实现其功能。事务隔离和一致性是2个不同的概念。楼主为了达到一致性,用惯了某种数据库的某种事务隔离度,而刚好这个数据库用内部加锁的方式 满足了一致性,所以就认为所有的数据库都会自动加锁。反之就是错误的。
对 事务是正确的,怎么会错误呢?你看你的事务你把时间延迟一下
在sqlserver 下就很明显,
t1:begin;
delete from t1 where id > 6;
t2:begin ;
select * from t1 where id > 6;sqlserver
如果这样
set transaction isplation level read commited
begin tr1
delete from t1 where id > 6;
waitfor delay "00:00:10";
commit tr1然后在10内执行
set transaction isplation level read commited
begin tr2
select * from t1 where id > 6;
6;
commit tr2你就会独到的数据是删除后的数据,并且第二个提交的时间也会在第一个提交了后在执行