cari

ORACLE 事务处理

Jun 07, 2016 pm 03:24 PM
oraclekenapahal ehwalpemprosesan transaksikemasmahu

ORACLE事务整理: 1、为什么要有事务的存在? 对数据库的访问是一个多用户且存在高并发的操作,如多用户在某一时间点上对同一条数据实行更新操作,导致数据严重混乱、不一致、破坏了数据的完整和安全性。 数据库事务管理这一应用横空出世,解决了多用户高并

ORACLE事务整理:

1、为什么要有事务的存在?

      对数据库的访问是一个多用户且存在高并发的操作,如多用户在某一时间点上对同一条数据实行更新操作,导致数据严重混乱、不一致、破坏了数据的完整和安全性。

      数据库事务管理这一应用横空出世,解决了多用户高并发下数据严重混乱的情况,很好的控制多用户高并发环境下所可能带来的数据混乱、不一致性,保证了数据完整性

      和安全性。此乃真是一计灵丹妙药(事务管理)。假设数据库不存在事务处理特性,导致后果主要有:

      1). 脏读:两个事务并发情况下,其中一个事务读取了另一个事务更新但未提交的记录,这时另外一个事务处于某种考虑回滚该更新操作。其中第一个数据读的数据就

              是数据库中不存在的数据,也就是脏数据,被称为脏读(oracle中不存在脏读)。

      2).幻读:一个事务,两个不同时间,读取的数据不同,被他人更新了。

      3).不可重复读:一个事务,T1有一个查询结果集,T2再查询,数据变多了,他人有插入。


     说白了,数据库事务处理就是为解决上面三个问题而存在的。操作数据库时加上事务特性处理,就不怕当前会话操作的数据,被另外一个会话所打搅。


2、什么是事务?

      事务是一条或多条SQL语句组成的逻辑执行块,这块中内容SQL要么全都执行成功,那么全执行失败。不存在部分SQL执行成功或失败。(之所以事务返回状态都是一致或

      成功或失败,是因为有事务隔离级别这么一说,见下文介绍)。事务使得执行数据库操作互不影响。


3、事务具备的特性?

     1). 原子性:一个事务要么全执行成功,要么全执行失败。比如,事务里面有100条执行SQL,要么100条SQL全部执行成功,如有一条执行失败,事务将其他执行成功SQL

                             回滚为之前状态。

     2).一致性:事务状态必须为一致的。比如,银行转账A账户给B账户装100¥,这是B账户+100¥同时A账户必须-100¥,从一个一致性状态转变为另外一个一致性状态。

     3).隔离性:事务执行互不影响。每个事务只能干预事己内部的操作,而无法干预别的事务操作。

     4).永久性:事务一旦提交,产生数据变化将是永久的。

4、控制事务命令(oracle中事务是隐式开始的,结束时需要显示结束commit,rollback):

     1、commit;  提交事务                  作用:--事务结束

     2、rollback; 回滚事务之前状态  作用:--事务结束

5、ORACLE事务隔离级别

     1). READ COMMITTED :读取提交事务;允许存在幻读、不重复读。不存在脏读。(脏读ORACLE中不存在)

     2).SERIALIZABLE:序列化级别;只能看见本事务开始前提交的数据,不存在幻读、不重复读、脏读。

     3).READ ONLY :只读事务;是序列化级别的子集,也只能看见本事务开始前提交的数据,但不允许在事务中进行DML语句

     ORACLE中事务级别只存在以上三种,其中READ COMMITTED 默认级别。 标准SQL事务级别为5种(想具体了解查询百度)。


6、设置事务隔离级别语法:

    SET transaction isolation level [read commited | serializable]    --设置读提交事务和序列化级别

    SET transaction isolation level read only;                                        --设置只读事务

7、事务处理演练(就以本机存在的classes表为例):


1、读提交事务和序列化事务级别进行事务处理

会话1:

SQL> select * from classes;                                                          
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

SQL> insert into classes values(4,'0904');
1 row inserted

--以上是会话1新增一条数据,但未提交事务。下面执行会话2查询该表操作

会话2

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

--会话2查询结果集中,没有查到事务1新增未提交的数据,因为oracle默认的是读取提交后事务 READ COMMITED,也就是避免了脏读,ORACLE也就不存在脏读


会话1:提交事务

SQL> commit;
Commit complete

事务2再次执行查询语句:

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0904


--会话2中包含了事务1提交的数据,发生了幻读


会话1:删除刚新增的一条记录并提交事务

SQL> delete from classes where cid=4;
1 row deleted

SQL> commit;
Commit complete

会话2:再次执行查询语句

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

--会话2查询结果与之前查询结构不一致,未包含cid=4数据。发生了不可重复读。


会话2:为会话2设置事务,级别为:序列化级别

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

SQL> SET transaction isolation level serializable;
Transaction set


会话1:新增一条数据并提交

SQL> insert into classes values(4,'0904');
1 row inserted

SQL> commit;
Commit complete

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0904

会话2:进行再次执行查询语句

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

--在会话2中执行查询语句,结果中未包含事务1新增数据,既看不到其他事务所做的修改,避免了幻读。对当前事务提交(结束),再次执行查询语句就可看到事务1新增的数据行。

会话2提交事务:

SQL> commit;
Commit complete

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0904


会话2:再次设置事务级别为序列化级别

SQL> SET transaction isolation level serializable;
Transaction set


会话1:修改cid=4数据内容并提交

SQL> update classes set cname='0000' where cid=4;
1 row updated

SQL> commit;
Commit complete

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0000       --此条记录已被永久修改

会话2:再次执行查询SQL

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0904

--会话2执行查询语句,结果中看不到会话1中更改的数据,既看不到其他事务所修改的数据,避免了不可重复读。


————————————————————————————————————————————————————————————————————————————

使用只读级别进行事务处理:

会话2:将事务2设置为只读级别

SQL> SET transaction read only ;
Transaction set

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

会话1:新增一条数据并提交

SQL> insert into classes values(4,'0904');
1 row inserted

SQL> commit;
Commit complete

会话2:执行查询SQL结果

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903

--会话2中执行查询语句,结果中未包含会话1新增的数据,既看不到其他事务所做的修改,避免了幻读。对当前事务进行提交,再将事务级别设置为只读事务

SQL> commit;
Commit complete

SQL> SET transaction read only ;
Transaction set


会话1:更新一条记录并提交

SQL> update classes set cname='0000' where cid=4;
1 row updated

SQL> commit;
Commit complete

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0000

会话2:执行查询语句

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0904

--会话2中查询结果看不到会话1更改的数据,既看不到其他事务所做的修改。避免了不可重复读。对当前事务进行提交。再将事务级别设置为可读取级别


事务2:设置为可读取级别,执行修改数据操作。

SQL> select * from classes;
                                    CID CNAME
--------------------------------------- ----------
                                      1 0901
                                      2 0902
                                      3 0903
                                      4 0000

SQL> SET transaction read only ;
Transaction set

SQL> update classes set cname='1111' where cid=4;
update classes set cname='1111' where cid=4
ORA-01456: 不能在 READ ONLY 事务处理中执行插入/删除/更新操作

--ORACLE可读事务只能查询,不能做修改才做所以报错。


Kenyataan
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Bagaimanakah kardinaliti indeks MySQL mempengaruhi prestasi pertanyaan?Apr 14, 2025 am 12:18 AM

Cardinality Indeks MySQL mempunyai kesan yang signifikan terhadap prestasi pertanyaan: 1. Indeks kardinaliti yang tinggi dapat lebih berkesan menyempitkan julat data dan meningkatkan kecekapan pertanyaan; 2. Indeks kardinaliti yang rendah boleh membawa kepada pengimbasan jadual penuh dan mengurangkan prestasi pertanyaan; 3. Dalam indeks bersama, urutan kardinaliti yang tinggi harus diletakkan di depan untuk mengoptimumkan pertanyaan.

MySQL: Sumber dan Tutorial untuk Pengguna BaruMySQL: Sumber dan Tutorial untuk Pengguna BaruApr 14, 2025 am 12:16 AM

Laluan pembelajaran MySQL termasuk pengetahuan asas, konsep teras, contoh penggunaan, dan teknik pengoptimuman. 1) Memahami konsep asas seperti jadual, baris, lajur, dan pertanyaan SQL. 2) Ketahui definisi, prinsip kerja dan kelebihan MySQL. 3) menguasai operasi CRUD asas dan penggunaan lanjutan, seperti indeks dan prosedur yang disimpan. 4) Biasa dengan debugging kesilapan biasa dan cadangan pengoptimuman prestasi, seperti penggunaan rasional indeks dan pertanyaan pengoptimuman. Melalui langkah -langkah ini, anda akan memahami sepenuhnya penggunaan dan pengoptimuman MySQL.

Mysql dunia nyata: Contoh dan kes penggunaanMysql dunia nyata: Contoh dan kes penggunaanApr 14, 2025 am 12:15 AM

Aplikasi dunia nyata MySQL termasuk reka bentuk pangkalan data asas dan pengoptimuman pertanyaan kompleks. 1) Penggunaan Asas: Digunakan untuk menyimpan dan mengurus data pengguna, seperti memasukkan, menanyakan, mengemas kini dan memadam maklumat pengguna. 2) Penggunaan lanjutan: Mengendalikan logik perniagaan yang kompleks, seperti perintah dan pengurusan inventori platform e-dagang. 3) Pengoptimuman Prestasi: Meningkatkan prestasi dengan menggunakan indeks, jadual partisi dan cache pertanyaan.

Perintah SQL di MySQL: Contoh PraktikalPerintah SQL di MySQL: Contoh PraktikalApr 14, 2025 am 12:09 AM

Perintah SQL di MySQL boleh dibahagikan kepada kategori seperti DDL, DML, DQL, dan DCL, dan digunakan untuk membuat, mengubah suai, memadam pangkalan data dan jadual, memasukkan, mengemas kini, memadam data, dan melakukan operasi pertanyaan yang kompleks. 1. Penggunaan asas termasuk jadual penciptaan createtable, memasukkan data memasukkan, dan pilih data pertanyaan. 2. Penggunaan lanjutan melibatkan gabungan untuk Jadual Bergabung, Subqueries dan Groupby untuk Agregasi Data. 3. Kesilapan umum seperti kesilapan sintaks, jenis data yang tidak sepadan dan masalah kebenaran boleh disahpepijat melalui pemeriksaan sintaks, penukaran jenis data dan pengurusan kebenaran. 4. Cadangan Pengoptimuman Prestasi termasuk menggunakan indeks, mengelakkan pengimbasan jadual penuh, mengoptimumkan operasi gabungan dan menggunakan transaksi untuk memastikan konsistensi data.

Bagaimanakah InnoDB mengendalikan pematuhan asid?Bagaimanakah InnoDB mengendalikan pematuhan asid?Apr 14, 2025 am 12:03 AM

InnoDB mencapai atomik melalui undolog, konsistensi dan pengasingan melalui mekanisme penguncian dan MVCC, dan kegigihan melalui redolog. 1) Atomicity: Gunakan Undolog untuk merekodkan data asal untuk memastikan urus niaga dapat dilancarkan kembali. 2) Konsistensi: Memastikan konsistensi data melalui penguncian peringkat baris dan MVCC. 3) Pengasingan: Menyokong pelbagai tahap pengasingan, dan RepeatableRead digunakan secara lalai. 4) Kegigihan: Gunakan redolog untuk merekodkan pengubahsuaian untuk memastikan data disimpan untuk masa yang lama.

Tempat Mysql: Pangkalan Data dan PengaturcaraanTempat Mysql: Pangkalan Data dan PengaturcaraanApr 13, 2025 am 12:18 AM

Kedudukan MySQL dalam pangkalan data dan pengaturcaraan sangat penting. Ia adalah sistem pengurusan pangkalan data sumber terbuka yang digunakan secara meluas dalam pelbagai senario aplikasi. 1) MySQL menyediakan fungsi penyimpanan data, organisasi dan pengambilan data yang cekap, sistem sokongan web, mudah alih dan perusahaan. 2) Ia menggunakan seni bina pelanggan-pelayan, menyokong pelbagai enjin penyimpanan dan pengoptimuman indeks. 3) Penggunaan asas termasuk membuat jadual dan memasukkan data, dan penggunaan lanjutan melibatkan pelbagai meja dan pertanyaan kompleks. 4) Soalan -soalan yang sering ditanya seperti kesilapan sintaks SQL dan isu -isu prestasi boleh disahpepijat melalui arahan jelas dan log pertanyaan perlahan. 5) Kaedah pengoptimuman prestasi termasuk penggunaan indeks rasional, pertanyaan yang dioptimumkan dan penggunaan cache. Amalan terbaik termasuk menggunakan urus niaga dan preparedStatemen

Mysql: Dari perniagaan kecil ke perusahaan besarMysql: Dari perniagaan kecil ke perusahaan besarApr 13, 2025 am 12:17 AM

MySQL sesuai untuk perusahaan kecil dan besar. 1) Perniagaan kecil boleh menggunakan MySQL untuk pengurusan data asas, seperti menyimpan maklumat pelanggan. 2) Perusahaan besar boleh menggunakan MySQL untuk memproses data besar dan logik perniagaan yang kompleks untuk mengoptimumkan prestasi pertanyaan dan pemprosesan transaksi.

Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apa yang dibaca oleh Phantom dan bagaimana InnoDB menghalang mereka (kunci seterusnya)?Apr 13, 2025 am 12:16 AM

InnoDB secara berkesan menghalang pembacaan hantu melalui mekanisme utama. 1) Kekunci seterusnya menggabungkan kunci baris dan kunci jurang untuk mengunci rekod dan jurang mereka untuk mengelakkan rekod baru daripada dimasukkan. 2) Dalam aplikasi praktikal, dengan mengoptimumkan pertanyaan dan menyesuaikan tahap pengasingan, persaingan kunci dapat dikurangkan dan prestasi konkurensi dapat ditingkatkan.

See all articles

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Artikel Panas

R.E.P.O. Kristal tenaga dijelaskan dan apa yang mereka lakukan (kristal kuning)
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Tetapan grafik terbaik
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Cara Memperbaiki Audio Jika anda tidak dapat mendengar sesiapa
3 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Cara Membuka Segala -galanya Di Myrise
4 minggu yang laluBy尊渡假赌尊渡假赌尊渡假赌

Alat panas

SublimeText3 Linux versi baharu

SublimeText3 Linux versi baharu

SublimeText3 Linux versi terkini

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Persekitaran pembangunan bersepadu PHP yang berkuasa

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Penyesuai Pelayan SAP NetWeaver untuk Eclipse

Integrasikan Eclipse dengan pelayan aplikasi SAP NetWeaver.

EditPlus versi Cina retak

EditPlus versi Cina retak

Saiz kecil, penyerlahan sintaks, tidak menyokong fungsi gesaan kod