[b]沒有事務[/b]:保證了sql語句級別的讀一致性。
即在一條sql語句執行期間,它只會看到執行前點的資料狀態,而不會看到執行期間資料被其他sql改變的狀態。
存在的問題:比如你做乙個報表查詢,在執行完第一條sql的時候,執行第二條查詢sql,而這個之間有資料被改變了,第二條資料查詢就有可能不一致
[b]唯讀事務[/b]:保證了事務級別的讀一致性
在該事務範圍內執行的多條sql都只會看到執行前點的資料狀態,而不會看到事務期間的任何被其他 sql改變的狀態。
唯讀事務可以解決沒有事務導致的一致性問題。
舉例:建表:
create table `t_pai` (
`id` bigint(20) not null auto_increment,
`name` varchar(10) not null,
`update_time` timestamp not null default current_timestamp on update current_timestamp comment '更新時間',
primary key (`id`),
key `idx_update_time` (`update_time`)
) engine=innodb auto_increment=46 default charset=utf8
客戶端1:
set autocommit =1;
insert into t_pai(name,update_time) values ("1",now());
select sleep(10) from dual;
insert into t_pai(name,update_time) values ("2",now());
select sleep(5) from dual;
insert into t_pai(name,update_time) values ("3",now());
select sleep(2) from dual;
insert into t_pai(name,update_time) values ("4",now());
select sleep(2) from dual;
insert into t_pai(name,update_time) values ("5",now());
select sleep(2) from dual;
commit;
客戶端2:
先執行:
start transaction read only;
select * from t_pai;
反覆執行:
select * from t_pai;
輸出:查詢不到資料。
客戶端3:
select * from t_pai;
反覆執行,可以看到資料一條一條的插入,資料一致性被破壞
oracle唯讀事務
一致性讀是oracle區別於其他資料庫的重要特點之一,但一般來說,這個一致性讀是sql級別的,只針對單個sql有效。由於業務邏輯需要,我們可能需要在乙個事務中的多個sql也能實現讀一致性,也就是說,資料來源在事務開始時就定下來了,不受其他會話影響。oracle的唯讀事務可以實現這個功能,它可以在事務...
唯讀事務和沒有事務
在專案中看到 transactional readonly true 註解 該屬性用於設定當前事務是否為唯讀事務,設定為 true 表示唯讀,false 則表示可讀寫,預設值為 false 例如 transactional readonly true 了解到是唯讀事務,網上搜了下唯讀事務和沒有事務的...
mysql 設定唯讀事務 Spring 唯讀事務
transactional readonly true 這東西不叫唯讀事務,它只是建立了乙個唯讀的資料庫連線。transactional裡面還有個引數,叫isolation這個才是控制隔離級別的。spring提供了5種事務隔離級別予以解決 1 default預設級別 default為資料來源 資料庫...