赞
踩
第一步 在Oracle官网搜索“oracle 19c”
第二步 选择第一个并下载
第三步 下载完成之后解压,注意暂时需要关闭腾讯管家和一些安全保护的软件,然后右击setup.exe,“以管理员身份运行”
第四步 稍等一下会出现如下所示界面,选择“创建并配置单实例数据库”单选项,再点击“下一步”按钮
第五步 再选择该界面中的“桌面类”单选项,再点击“下一步”按钮
第六步 再选择“使用Windows内置账户”单选项,点击“下一步”按钮
第七步 在弹出的对话框中选择“是”
第八步 选择“数据库版本”为“标准版”,“全局数据库名”可以任意取,“口令”就是设置密码,(全局数据库名和口令要记住,我自己的全局数据库名是orcl,口令是Sa123456)取消勾选“创建为容器数据库”
第九步 记住“Oracle系统标识符(SID)”,(使用Oracle连接工具的时候需要用到),最后点击安装按钮
第一步 打开开始菜单,找到“Net Configuration Assistant”并点击
选择“命名方法配置”,然后点击“下一步”
此时确保“选定的命名方法”一栏中包含“本地命名”和“轻松连接命名“,然后点击下一步
第二步 选择“本地Net服务名配置”,点击下一步
选择“添加”选项,点击下一步
设置服务名为sorcl,点击下一步
选择TCP,点击下一步
在主机名处填写需要远程连接的IP地址(老师的是10.6.19.227),选择“使用标准端口号1521”,点击下一步
点击“是,进行测试”,下一步
点击“更改登录”,输入用户名和密码(我的用户名和密码都是s加学号),输入之后,显示“==测试成功==”后,点击下一步
设置网络服务名(可以自己任意取,我的是sorcl,要记住这个服务名,之后使用命令连接服务器的时候要用到),再点击下一步,然后会出现一个“是否配置另一个服务器”的界面,点击“否”。最后点击下一步,完成。
输入“sqlplus”后要求输入用户名和口令,用户名是s加学号@之前取的网络服务器名,口令是s加学号,(输入口令时光标不会移动,建议先写在记事本里再复制粘贴过来,粘贴之后口令不会有显示,直接回车即可),显示如下图所示即成功登录。
select table_name from user_tables;
desc emp;
执行导致死锁的语句:
1、用sqlplus连接数据库,执行
UPDATE dept SET loc='LOUDI' WHERE deptno = 40;
2、用SQL DEVELOPER连接数据库,执行
UPDATE emp SET deptno =40 WHERE ename LIKE 'S%';
UPDATE dept SET loc = 'BEIJING' WHRE deptno = 40;
3、返回SQLPLUS ,执行
UPDATE emp SET deptno=10 WHERE ename LIKE 'S%';
分析死锁原因:
两个不同的会话(一个通过sqlplus,另一个通过SQL DEVELOPER)执行了以下操作:
会话A (sqlplus) 执行了 UPDATE dept SET loc='LOUDI' WHERE deptno = 40;
这将锁定部门编号为40的DEPT记录。
会话B (SQL DEVELOPER) 首先执行了 UPDATE emp SET deptno=40 WHERE ename LIKE 'S%';
这将更新ename以'S'开头的员工的deptno字段为40。由于emp表中的deptno字段是外键,引用了dept表的deptno,因此在修改emp表时,Oracle数据库可能会获取dept表上deptno=40的一些行级锁(具体取决于数据库的隔离级别和外键约束设置),以确保参照完整性。
紧接着,会话B试图执行 UPDATE dept SET loc='BEIJING' WHERE deptno = 40;
这个操作需要对同一个deptno=40的DEPT记录进行更新,但由于会话A已经锁定了这条记录,所以会话B会被阻塞,等待会话A释放锁。
同样地,当会话A尝试执行 UPDATE emp SET deptno=10 WHERE ename LIKE 'S%';
时,它需要再次访问已经被会话B修改过的那些emp记录,并可能需要获得与会话B持有的那些emp记录相关的锁。这时,因为会话B未提交事务且持有emp表的部分锁,会话A也会被阻塞,等待会话B释放相关资源锁。
这样就形成了循环等待:会话A等待会话B释放DEPT表的锁以便完成其事务,而会话B又等待会话A释放EMP表的锁以便完成其事务。这就构成了死锁。
避免此类死锁的方法包括:
资源排序策略:确保所有事务按照同一顺序访问资源可以减少死锁的发生。例如,所有事务都首先更新EMP表再更新DEPT表,或者反之亦然。
事务最小化:尽量减小事务的范围和执行时间,尽快提交或回滚事务,减少持有锁的时间。
使用适当的隔离级别:选择较低的隔离级别可能允许更多的并发,但也可能导致更多的锁竞争和数据不一致性;选择较高的隔离级别可能降低死锁的可能性,但可能会增加锁的数量和持续时间。
死锁检测与自动解决:大多数现代数据库管理系统如Oracle都有内置的死锁检测机制,一旦检测到死锁,会选择其中一个事务进行回滚以打破死锁循环。
显式锁定:在某些情况下,通过显式控制锁定模式和范围也可以帮助管理死锁风险,但这种方法通常更复杂,并需要谨慎设计和实现。
预定义事务执行顺序:如果业务逻辑允许,可以通过预定义并发进程的执行顺序来避免特定的死锁情况。
定期检查和超时处理:设置事务超时,在超时时自动回滚事务,这有助于防止长期存在的死锁。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。