我不完全清楚数据库系统中的事务是做什么的.我知道他们可以用来完全回滚更新列表(例如在一个帐户上扣钱并将其添加到另一个帐户),但这就是他们所做的一切吗?具体来说,他们可以用来预防竞争条件吗?例如:
// Java/JPA example
em.getTransaction().begin();
User u = em.find(User.class, 123);
u.credits += 10;
em.persist(u); // Note added in 2016: this line is actually not needed
em.getTransaction().commit();
Run Code Online (Sandbox Code Playgroud)
(我知道这可能是作为单个更新查询编写的,但这并非总是如此)
此代码是否受到竞争条件的保护?
我最感兴趣的是MySQL5 + InnoDB,但也欢迎一般的答案.
是否可以对单表使用merge语句?我想在插入之前检查是否已存在相同的值集,则应更新该记录,如果不存在,则应插入该记录。我在互联网上搜索过,但我得到了带有 2 个表的合并语句的示例。我在一张桌子上尝试过,但无法获得积极的结果。我试图检查的值将是动态的。我想在我的应用程序中使用这个查询。
我正在尝试检查(在下面的情况下仅“主要”列)如果两列匹配,则应更新该记录,如果不匹配,则应插入该记录。
我创建了一个示例表学生。下面是查询。
create table student (sid int,name varchar(20),major varchar(10),gpa float,tutorid int, PRIMARY KEY (sid))
insert into student values(101,'Bill','CIS',3.45,102)
insert into student values(102,'Mary','CIS',3.1,null)
insert into student values(103,'Sue','Marketing',2.95,102)
insert into student values(104,'Tom','Finanace',3.5,106)
insert into student values(105,'Alex','CIS',2.75,106)
insert into student values(106,'Sam','Marketing',3.25,103)
insert into student values(107,'Joan','Finance',2.9,102)
Run Code Online (Sandbox Code Playgroud)
以下是我正在使用的查询
merge into student a
using (select name,major from student) b
on (a.major=b.major)
when matched then
update set a.name='Rahul'
when not matched then
insert(a.SID,a.major) values(123, 'Temp')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
ORA-30926: 无法在源表中获取稳定的行集
也许我做的事情完全错误。谁能帮帮我吗。