oracle数据库支持多用户间同时对同一个表进行操作,但是数据不一定同步,因为oracle数据库是支持脏数据的,比如A用户删除了表的数据但没有提交,B用户也能查询访问到,如果要避免这种情况只能加锁,A用户在操作表时先进行select * from table_name for update,这是,如果B用户再查询时只会等待A用户提交完成后才能查询到数据,如果A不提交,B用户只能在等待。

1. 问题 1 多用户对一个表同时进行增,删,改,查等操作的情况

多用户操作的影响主要是会锁定记录,oracle数据库提供行级锁,也就是说用户操作数据时,oracle为记录行加锁。当然,如果用户一次性操作的数据过多,oracle的锁资源过大,或者锁定数据长时间没有释放(例如几百万条记录更新移植没有提交)。oracle的资源不够,行锁会升级为表锁。至于性能,仍然跟锁定的资源大小有关系。

多用户操作的解决方法:
一次更新量不要太大,记得及时提交结果,养成sql语句后面及时、立即commit或者rollback的习惯。否则待弹出提示界面后,等待用户操作确认的长时间间隔,会导致提交或回滚不及时。
多人操作表是有加锁的。也就是表是共享的,行是独占的。

你正在操作的行别人只能查,不能一起做修改的操作。你commit或rollback之后就会释放锁别人就可以操作了。
oracle并发可以解决这个问题,只要在增、删、改时记得及时commit或rollback就行了.

下面对多用户并发修改某一个行进行分析

首先你要了解什么叫做 “事务 transcation ” :一个事务包含一个或多个DML语句,是逻辑管理的工作单元(原子单元)。

注意:其中Commit, Rollback是显示的提交事务,而DDL语句是隐式的提交事务的。DDL语句的操作是没有办法回滚的。

当用户对数据进行修改时(DML操作),oracle会给数据分配两个 锁 ,一个是行排他锁 另一个是表共享锁

行排他锁:如果A用户对某个表的某一行进行修改时,会把该行分配一个”行排他锁“

这样B用户就只能查看 不能修改了。但是B用户看到的数据确实老数据 , 那是因为A用户还没有结束该事务,换句话说A用户拿到了修改该行的所有权,但是怎么修改,修改之后会不会反悔 这些都是在A 提交该事务之前的  仅属于他个人的事情

而为了保证所有用户所看到数据的一致性, 在A用户 提交事务之前 大家看到的数据都是 老数据

举个例子:

1. 最开始 谁也没要修改的时候,数据是这样的:

SQL> select empno , ename , sal from emp where empno= 7900;

EMPNO ENAME             SAL

---------- ---------- ----------

7900 JAMES             950

2. A用户进行修改了,她就拿到了 这行的锁:

SQL> update emp set sal=6000 where empno=7900;

1 row updated.

SQL> select empno , ename , sal from emp where empno= 7900;

EMPNO ENAME             SAL

---------- ---------- ----------

7900 JAMES            6000

现在只有A用户能够查看到,修改后的数据。

3. B用户进行查看:

SQL> select empno , ename , sal from emp where empno= 7900;

EMPNO ENAME             SAL

---------- ---------- ---------

7900 JAMES             950

4. B用户进行修改:

SQL> update emp set sal=6000 where empno=7900;

......... 没有任何动静,因为该会话在等待A用户的提交。 过了十分钟后,A用户提交了 那么B立刻就抢到了这把锁。

”如果多个用户同时修改同一客户记录,而且先后提交修改,Oracle 怎样保证该客户记录“     就像按抢答器一样,就看是谁先得到这把”锁“

2 问题2 多用户同时对一个表进行增加操作情况

此时是不是要等一个增加完之后另一个才可以执行增加操作?

一个用户加数据,如果加完数据立即做事务处理,另一个用户就不用太久等待,甚至可能没有感觉。

再如果一个用户加数据加锁后不做事务处理,那另一个用户就会一直等待,直到第一个用户commit后才可以执行第二个用户的操作。

1 oracle的数据模式是:用户建在表空间上,表建在用户上
2 一个用户的表就象自己的私有财产一样,没有自己或管理员授权别的用户是不能查询或修改的;
3 对于不同用户下的同名表,都是独立的数据对象,如user1.table1和user2.table1是相互独立的,用户分别操作自己的表是不影响其他用户的;
4 对于同一用户下的同一个表,所有有权限的用户对其进行数据操作时,是会相互影响的,如对user1.table1来说,user1修改了它的一行,user2又对该表的该行进行了修改,那么该表的该行的实际内容是在user1修改后基础上user2修改的结果(注意,所有修改以最后成功提交修改请求的用户的内容为准),多个用户对同一个用户下的同一个表的同时修改和锁定,会造成锁等待。

C# 使用实物的demo

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Configuration;
  6. using System.Data;
  7. using Oracle.DataAccess.Client;
  8. using System.Runtime.InteropServices;
  9. using System.Text.RegularExpressions;
  10. using System.Diagnostics;
  11. using System.Data.Common;
  12. using System.Collections;
  13. namespace DB_Server
  14. {
  15.  
  16. #region //操作Oracle数据库
  17. public class OracleDBService
  18. {
  19. public OracleDBService(string ConnectionString)
  20. {
  21. OracleConStr = ConnectionString;
  22. }
  23. #region//连接数据库所需变量及方法
  24. private string OracleConStr = "";
  25. private OracleConnection conn;//创建sql连接
  26. private OracleCommand com;//创建sql命令对象
  27. private OracleDataReader dr;//创建sql数据阅读器
  28. private OracleDataAdapter sdr;//创建sql适配器
  29. private DataSet ds;//创建数据集
  30.  
  31. /// <summary>
  32. /// 创建数据库连接并打开
  33. /// </summary>
  34. public void open()
  35. {
  36. //创建连接
  37. conn = new OracleConnection(OracleConStr);
  38. if (conn.State == ConnectionState.Closed)
  39. {
  40. conn.Open();
  41. }
  42. else if (conn.State == ConnectionState.Broken)
  43. {
  44. conn.Close();
  45. conn.Open();
  46. }
  47. }
  48. #region//事务操作数据库
  49. /// <summary>
  50. /// 提交一组(多条)SQL语句操作数据库
  51. /// </summary>
  52. /// <param name="commandStringList">SQL列表</param>
  53. /// <returns>执行结果</returns>
  54. public int UpdateBatchCommand(ArrayList commandStringList)
  55. {
  56. open();
  57. OracleTransaction m_OraTrans = conn.BeginTransaction();//创建事务对象
  58. com = new OracleCommand();
  59. com.Connection = conn;
  60. string tmpStr = "";
  61. int influenceRowCount = ;
  62. try
  63. {
  64. foreach (string commandString in commandStringList)
  65. {
  66. tmpStr = commandString;
  67. com.CommandText = tmpStr;
  68. influenceRowCount += com.ExecuteNonQuery();
  69. }
  70. m_OraTrans.Commit();
  71. return influenceRowCount;
  72. }
  73. catch (OracleException ex)
  74. {
  75. m_OraTrans.Rollback();
  76. throw ex;
  77. }
  78. }
  79. #endregion

oracle使用存储过程进行数据更新,可参考下面的博文。

C#调用Oracle存储过程

参考文章

使用oracle数据库,多用户同时对一个表进行增加,删除,修改,查看等操作,会不会有影响

_Debug, Oracle多用户同时修改同一记录,怎样保证该客户记录,2017.5.8

C#使用事务操作ORACLE数据库

Oracle多用户对一个表进行并发插入数据行操作的更多相关文章

  1. oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号?

    Oracle 语句中“||”代表什么啊? oracle数据库表中,插入数据的时候如何产生一个 字母+数字 编号? 排序的话,用order by来处理即可.比如:cola123a234b999b335s ...

  2. SQL技巧两则:选择一个表的字段插入另一个表,根据其它表的字段更新本表内容

    最近,在作django数据表迁移时用到的. 因为在django中,我把本来一个字符型字段,更改成了外键, 于是,哦喝~~~字符型字段相当于被删除了, 为了能导入这些字段的外键信息,于是出此下策. 其实 ...

  3. SQL Server ->> SQL Server 2016重要功能改进之 -- INSERT SELECT时并发插入数据

    SQL Server 2016对INSERT INTO XXXX SELECT语句进行了优化,在某些情况下可以触发数据的并行插入,但是要求兼容模式是130(SQL Server 2016)以及在插入的 ...

  4. 【452】pandas筛选出表中满足另一个表所有条件的数据

    参考:pandas筛选出表中满足另一个表所有条件的数据 参考:pandas:匹配两个dataframe 使用 pd.merge 来实现 on 表示查询的 columns,如果都有 id,那么这是很好的 ...

  5. Informix从一个表更新多选数据到另一个表

    功能如题, Informix从一个表更新多选数据到另一个表 例如, 要更新tab01的几个字段数据, 这些数据来自tab02, tab01和tab02之间通过id关联 参考语句: update tab ...

  6. 传智播客JavaWeb day09-mysql入门、数据库操作、数据库表操作、数据行操作

    不知不觉已到了第九天了,今天主要讲了关系数据库的基本概述.安装.数据库.表和数据行的操作 1. 基本概述 1.1 数据库就是用来存储数据的.早期是存在文件里面的操作起来效率低而且不是很安全. 1.2 ...

  7. sql如何向一个表中批量插入大量数据

    --如果是一个表插入另外一个表.insert into tb1 需要的列名 select 按照前面写上需要的列名 from tb2 --如果两表结构一样.insert into tb1 * selec ...

  8. SQL向一个表中批量插入&&删除大量数据

    插入: 1. 数据从另一个表中获取 (1)两表结构不一样insert into tb1 需要的列名 select 按照前面写上需要的列名 from tb2(2)两表结构一样insert into tb ...

  9. 删除一个表中的重复数据同时保留第一次插入那一条以及sql优化

    业务:一个表中有很多数据(id为自增主键),在这些数据中有个别数据出现了重复的数据. 目标:需要把这些重复数据删除同时保留第一次插入的那一条数据,还要保持其它的数据不受影响. 解题过程: 第一步:查出 ...

随机推荐

  1. 【linux】如何解决VMWare上linux虚拟机连不上外网的问题?

    >>>故障现象:虚拟机连接不到外网? >>>故障背景: Centos7.4发行版本: 虚拟机和VM软件都是nat模式: 注意这里默认的VMWare的DHCP服务时开 ...

  2. zoj 1508 Intervals (差分约束)

    Intervals Time Limit: 10 Seconds      Memory Limit: 32768 KB You are given n closed, integer interva ...

  3. Codeforces Round #336 (Div. 2) A

    A. Saitama Destroys Hotel time limit per test 1 second memory limit per test 256 megabytes input sta ...

  4. HDU 1863 畅通工程 -Kruskal模版

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. shell脚本——项目2

    案例名称:发送告警邮件 背景: 外部邮箱的服务器(163等) 安装mailx(yum) 配置邮箱信息 vim /etc/mail.rc #配置自己的邮箱信息 set from=18906534060@ ...

  6. 转:Java NIO(3)

    要想讲清楚nio的原理和它的优点得先清楚Java应用程序的文件读写原理和虚拟内存的原理.Java文件读取原理可参见如下图: 当应用程序需要读取文件的时候,内核首先通过DMA技术将文件内容从磁盘读入内核 ...

  7. CSS Sprites技术

    CSS Sprites技术,国内很多人也叫雪碧图,因为sprite麻 (你买一瓶雪碧就看得到大大的sprite字样了) 主要用于将网站的零碎图标的img标签取代,因为每个img标签引用的src就会造成 ...

  8. 洛谷P3120 [USACO15FEB]Cow Hopscotch

    题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John&apos;s cows have invented ...

  9. 【CF1020D】The hat(交互,二分)

    题意:有n个人围成一个圈,n为偶数,每个人有一个数字a[i],保证相邻两个人的数字差为1 最多可以询问60次,要求获得一个i使得a[i]=a[i+n/2] n<=1e5,abs(a[i])< ...

  10. linux 安装 pip

    # wget https://bootstrap.pypa.io/get-pip.py # python get-pip.py