我有以下场景,
public void someEjbMethod1()
{
for (int i=0; i=10; i++)
{
em.merge(arr[i]);
em.flush();
}
}
Run Code Online (Sandbox Code Playgroud)
我需要分别合并 ( arr[i]) 的每个对象。因为上面的代码将arr[i]在函数末尾提交所有实例。
我正在考虑执行以下操作:
public void someEjbMethod1()
{
for (int i=0; i=10; i++)
{
saveObj(arr[i]);
}
}
// should I use a transaction attribute here??
public void saveObj(SomeObject obj)
{
em.merge(arr[i]);
em.flush();
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有数据的测试SQL Server表
ItemId Description ItemCost
1 first item 100
2 second item 200
3 third item 300
Run Code Online (Sandbox Code Playgroud)
以及将项添加到Items表的存储过程
create proc spInsertItem
@itemId int
,@itemDescription varchar(50)
,@itemCost decimal
as
begin
if(@itemCost < 0)
begin
raiserror('cost cannot be less than 0',16,1)
end
else
begin
begin try
begin tran
insert into Items(itemid, [description],itemCost)
values (@itemid, @itemdescription,@itemCost)
commit tran
end try
begin catch
rollback tran
select ERROR_LINE()as errorLine
,ERROR_MESSAGE() as errorMessage
,ERROR_STATE() as errorState
,ERROR_PROCEDURE() as errorProcedure
,ERROR_NUMBER() as errorNumber
end catch …Run Code Online (Sandbox Code Playgroud) 我们有一个应用程序必须生成唯一的顺序序列号并将范围存储在数据库中.我们只需记录数字范围,我们将实际存储在其他地方
基本上,它是如何安装,现在是我们有三列一个简单的表SequenceStartNumber,SequenceEndNumber和AllocatedFor.
例如,行可能如下所示:
SequenceStartNumber SequenceEndNumber AllocatedFor
1 1000 CustomerXYZ
1001 2000 CustomerZZY
Run Code Online (Sandbox Code Playgroud)
一段代码将执行查询
SELECT MAX(SequenceEndNumber) + 1 AS FirstNumber
FROM SequenceNumberAllocation
Run Code Online (Sandbox Code Playgroud)
代码获取此查询的结果,添加它知道它需要的许多序列号,并执行插入
INSERT INTO SequenceNumberAllocation (SequenceStartNumber, SequenceEndNumber, AllocatedFor)
VALUES (%d, %d, 'CustomerABC')
Run Code Online (Sandbox Code Playgroud)
这样我们就有了这些数字块的运行列表,以及谁在使用它们.
这样可以正常工作,除了很明显这个方法不能解释并发性.假设(它还没有发生)两个同时进程可以同时执行第一个查询并获取相同的起始编号.
在insert子句完成之前阻止表的最佳方法是什么?这个操作应该以某种方式形成存储过程吗?SQL不是我最强的诉讼,因此我不得不问其他人可能是什么基本问题.谢谢你的时间.
在Oracle中,我正在调用以下查询(而不是来自sqlplus)作为安装脚本的一部分:
ALTER TABLE MYTABLE DISABLE CONSTRAINT PFTATTRS_ATTR_FK;
INSERT INTO MYTABLE (PTF_ID, ATTR_ID) VALUES (1, 5);
ALTER TABLE MYTABLE ENABLE CONSTRAINT PFTATTRS_ATTR_FK;
Run Code Online (Sandbox Code Playgroud)
如您所见,我将DML(需要COMMIT)与DDL(自动提交)交错.我的疑问是:我是否需要在每个DDL之前提交DML,或者在我的脚本结尾处进行一次大提交是否安全?
我的API服务器接受post请求,请求体是JSON,所以我创建两个struct对象来接受JSON字符串并将其持久化到database.But每次我接受一个请求我需要一遍又一遍地创建struct对象,我试着清除结构而不是重新创建它.演示代码如下:
//The two struct
type Card struct {
Number string
Type string
}
type Person struct {
Name string
Cards []Card
}
var p Person
//parse JSON to the struct object
func init() {
str := `{"name":"aaa","cards":[{"number":"1","type":"visa"},{"number":"2","type":"mastercard"}]}`
json.Unmarshal([]byte(str), &p)
}
func PersistToDatabase() {
var err error
tx, err := db.Begin()
if err != nil {
return
}
defer func() {
if err != nil && tx != nil {
if err := tx.Rollback(); err != nil {
return
}
} …Run Code Online (Sandbox Code Playgroud) 我是春季/学生交易的新手,阅读后我仍然不清楚,所以我在这里发帖,
我有一个服务类,注释为@Transactional,我有一些方法,其中一些注释为
@Transactional(propagation = Propagation.REQUIRES_NEW)
Run Code Online (Sandbox Code Playgroud)
其中一些不是.
@Transactional
class SomeService {
def findJob() {
MyInstance myInstance = getMeAJob();
if (myInstance) {
doSomeThing(myInstance)
doTask()
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception)
private doSomeThing(MyInstance myInst) {
myObj = MyInstance.lock(myInst.id)
try {
differentObj = doTask(myObj)
myObj.save()
doAnotherThing()
}
} catch (Exception e) {
log("Error in doAnotherTask")
}
}
private doAnotherThing(MyInstace myInst) {
perform some update on myInst
myInstant.save(flush: true)
}
private doTask() {
}
Run Code Online (Sandbox Code Playgroud)
将在t2中执行的方法 - doSomeThing() …
我第一次尝试Laravel事务...我使用Eloquent进行大部分查询,因为那里没有事务,我必须混合使用Eloquent和查询构建器.
这是我的代码:
DB::beginTransaction();
try{
Setting::truncate();
Setting::insert($data);
DB::commit();
jok('all ok');
}
catch (\Exception $e)
{
DB::rollback();
jerror('some error accorded! ');
}
Run Code Online (Sandbox Code Playgroud)
所以我已经绑定到添加一些无效的数据到设置,我得到了some error accorded错误按预期但INSERT之前的查询Setting::truncate();仍然执行,我最终得到一个空表.
所以要么我做错了什么,要么事务不能截断.
有人可以解释一下为什么同时执行交易是可取的吗?搜索了几个小时,我找不到一个明确的答案.谢谢.
假设我们使用create new table并为我们的数据库启用快照隔离:
alter database database_name set allow_snapshot_isolation on
create table marbles (id int primary key, color char(5))
insert marbles values(1, 'Black') insert marbles values(2, 'White')
Run Code Online (Sandbox Code Playgroud)
接下来,在会话1中开始一个快照事务:
set transaction isolation level snapshot
begin tran
update marbles set color = 'Blue' where id = 2
Run Code Online (Sandbox Code Playgroud)
现在,在提交更改之前,在会话2中运行以下命令:
set transaction isolation level snapshot
begin tran
update marbles set color = 'Yellow' where id = 2
Run Code Online (Sandbox Code Playgroud)
然后,当我们提交会话1时,会话2将失败,并显示有关事务中止的错误 - 我知道这可以防止更新丢失.
如果我们逐个执行此步骤但具有任何其他隔离级别,例如:可序列化,可重复读取,读取提交或未提交读取,则会执行此会话2,从而对表进行新的更新.有人可以解释一下我为什么会这样吗?对我来说,这是一种丢失的更新,但似乎只有快照隔离才能阻止它.
t-sql sql-server transactions transaction-isolation isolation-level
以我的理解,mysql binlog可以完全充当InnoDB的重做日志。
那么,启用Binlog后,为什么InnoDB必须同时编写重做日志,而不是仅仅切换为使用Binlog?这是否会大大降低数据库的写入性能?
除了简化设计和实现之外,这样做还有什么好处?
AFAIK,要在保证ACID符合性的同时启用两个日志,将发生以下问题:
因此,所有其他产品似乎仅使用一组日志(SQL Server称为事务日志,ORACLE称为重做日志,PostgreSQL称为WAL)来完成所有相关工作。难道只有MySQL必须同时打开两组日志以确保ACID合规性和强而一致的主从复制吗?
在仅启用其中一项的情况下,是否有一种方法可以实现ACID遵从性和强大的一致半同步复制?
我使用此命令在多行中插入多个记录,如果插入不成功,如何锁定命令和回滚更改?
SqlCommand cmd = new SqlCommand();
string s = @"
declare @one_id int;
INSERT INTO tbl_one(o1,o2,o3) VALUES(@o1,@o2,@o3);
set @one_id=SCOPE_IDENTITY();
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t1,@t2,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t3,@t4,@one_id);
INSERT INTO tbl_two(t1,t2,f3) VALUES(@t5,@t6,@one_id);
";
cmd.CommandText =s;
Run Code Online (Sandbox Code Playgroud) 请不要建议我为此使用交易注意事项.
我遇到了一个与Spring处理事务有关的错误.
请看一下这两个测试用例,注释在代码中:
实体类例如:
@Entity
public class Person{
@Id
String name;
}
Run Code Online (Sandbox Code Playgroud)
使用的一些方法:
public TransactionStatus requireTransaction() {
TransactionTemplate template = new TransactionTemplate();
template.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
return getTransactionManager().getTransaction(template);
}
public Session session() {
return getRepository().session();
}
public PlatformTransactionManager getTransactionManager() {
return getRepository().getTransactionManager();
}
Run Code Online (Sandbox Code Playgroud)
这是第一个测试,testA();
@Test
public void testA() throws InterruptedException {
// We create the first transaction
TransactionStatus statusOne = requireTransaction();
// Create person one
Person pOne = new Person();
pOne.name = "PersonOne";
session().persist(pOne);
// ---> 111) NOTE! We do not commit! Intentionally! …Run Code Online (Sandbox Code Playgroud) transactions ×12
sql-server ×5
asp.net ×2
spring ×2
sql ×2
acid ×1
c# ×1
commit ×1
concurrency ×1
database ×1
ddl ×1
dml ×1
ejb ×1
go ×1
grails ×1
hibernate ×1
innodb ×1
java ×1
laravel ×1
laravel-5.2 ×1
locking ×1
mariadb ×1
mysql ×1
optimization ×1
oracle ×1
performance ×1
struct ×1
t-sql ×1