Skip to content

Commit 15c3ab7

Browse files
2881028810
authored andcommitted
- 增加 ISelect.ForUpdate 排他更新锁(根据数据库类型的规则,见代码注释);
- 完善 SqlServer WithLock 功能,组合多种使用 | 枚举相联;
1 parent 655d191 commit 15c3ab7

File tree

32 files changed

+470
-170
lines changed

32 files changed

+470
-170
lines changed

FreeSql.DbContext/FreeSql.DbContext.xml

Lines changed: 7 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/MySqlConnector/Curd/MySqlSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1598,5 +1598,21 @@ public void ToUpdate()
15981598
Assert.Equal(5, g.mysql.Select<ToUpd3Pk>().Count());
15991599
Assert.Equal(5, g.mysql.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
16001600
}
1601+
1602+
[Fact]
1603+
public void ForUpdate()
1604+
{
1605+
var orm = g.mysql;
1606+
orm.Transaction(() =>
1607+
{
1608+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1609+
Assert.Equal("SELECT a.`id`, a.`name` FROM `ToUpd1Pk` a limit 0,1 for update", sql);
1610+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1611+
1612+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1613+
Assert.Equal("SELECT a.`id`, a.`name` FROM `ToUpd1Pk` a limit 0,1 for update", sql);
1614+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1615+
});
1616+
}
16011617
}
16021618
}

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Dameng/Curd/DamengSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,5 +1525,21 @@ public void ToUpdate()
15251525
Assert.Equal(5, g.dameng.Select<ToUpd3Pk>().Count());
15261526
Assert.Equal(5, g.dameng.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
15271527
}
1528+
1529+
[Fact]
1530+
public void ForUpdate()
1531+
{
1532+
var orm = g.dameng;
1533+
orm.Transaction(() =>
1534+
{
1535+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1536+
Assert.Equal("SELECT a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a WHERE ROWNUM < 2 for update", sql);
1537+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1538+
1539+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1540+
Assert.Equal("SELECT a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a WHERE ROWNUM < 2 for update nowait", sql);
1541+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1542+
});
1543+
}
15281544
}
15291545
}

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Default/Curd/OdbcSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,5 +1336,21 @@ public void ToUpdate()
13361336
Assert.Equal(5, g.odbc.Select<ToUpd3Pk>().Count());
13371337
Assert.Equal(5, g.odbc.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
13381338
}
1339+
1340+
[Fact]
1341+
public void ForUpdate()
1342+
{
1343+
var orm = g.odbc;
1344+
orm.Transaction(() =>
1345+
{
1346+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1347+
Assert.Equal("SELECT TOP 1 a.[id], a.[name] FROM [ToUpd1Pk] a", sql);
1348+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1349+
1350+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1351+
Assert.Equal("SELECT TOP 1 a.[id], a.[name] FROM [ToUpd1Pk] a", sql);
1352+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1353+
});
1354+
}
13391355
}
13401356
}

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/MySql/Curd/MySqlSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1609,5 +1609,21 @@ public void ToUpdate()
16091609
Assert.Equal(5, g.mysql.Select<ToUpd3Pk>().Count());
16101610
Assert.Equal(5, g.mysql.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
16111611
}
1612+
1613+
[Fact]
1614+
public void ForUpdate()
1615+
{
1616+
var orm = g.mysql;
1617+
orm.Transaction(() =>
1618+
{
1619+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1620+
Assert.Equal("SELECT a.`id`, a.`name` FROM `ToUpd1Pk` a limit 0,1 for update", sql);
1621+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1622+
1623+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1624+
Assert.Equal("SELECT a.`id`, a.`name` FROM `ToUpd1Pk` a limit 0,1 for update", sql);
1625+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1626+
});
1627+
}
16121628
}
16131629
}

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/Oracle/Curd/OracleSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,5 +1525,21 @@ public void ToUpdate()
15251525
Assert.Equal(5, g.oracle.Select<ToUpd3Pk>().Count());
15261526
Assert.Equal(5, g.oracle.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
15271527
}
1528+
1529+
[Fact]
1530+
public void ForUpdate()
1531+
{
1532+
var orm = g.oracle;
1533+
orm.Transaction(() =>
1534+
{
1535+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1536+
Assert.Equal("SELECT a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a WHERE ROWNUM < 2 for update", sql);
1537+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1538+
1539+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1540+
Assert.Equal("SELECT a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a WHERE ROWNUM < 2 for update nowait", sql);
1541+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1542+
});
1543+
}
15281544
}
15291545
}

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/PostgreSQL/Curd/PostgreSQLSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1581,5 +1581,21 @@ public void ToUpdate()
15811581
Assert.Equal(5, g.pgsql.Select<ToUpd3Pk>().Count());
15821582
Assert.Equal(5, g.pgsql.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
15831583
}
1584+
1585+
[Fact]
1586+
public void ForUpdate()
1587+
{
1588+
var orm = g.pgsql;
1589+
orm.Transaction(() =>
1590+
{
1591+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1592+
Assert.Equal("SELECT a.\"id\", a.\"name\" FROM \"toupd1pk\" a limit 1 for update", sql);
1593+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1594+
1595+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1596+
Assert.Equal("SELECT a.\"id\", a.\"name\" FROM \"toupd1pk\" a limit 1 for update nowait", sql);
1597+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1598+
});
1599+
}
15841600
}
15851601
}

FreeSql.Tests/FreeSql.Tests.Provider.Odbc/SqlServer/Curd/SqlServerSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1475,5 +1475,21 @@ public void ToUpdate()
14751475
Assert.Equal(5, g.sqlserver.Select<ToUpd3Pk>().Count());
14761476
Assert.Equal(5, g.sqlserver.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
14771477
}
1478+
1479+
[Fact]
1480+
public void ForUpdate()
1481+
{
1482+
var orm = g.sqlserver;
1483+
orm.Transaction(() =>
1484+
{
1485+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1486+
Assert.Equal("SELECT TOP 1 a.[id], a.[name] FROM [ToUpd1Pk] a With(UpdLock, RowLock)", sql);
1487+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1488+
1489+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1490+
Assert.Equal("SELECT TOP 1 a.[id], a.[name] FROM [ToUpd1Pk] a With(UpdLock, RowLock, NoWait)", sql);
1491+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1492+
});
1493+
}
14781494
}
14791495
}

FreeSql.Tests/FreeSql.Tests/MySql/Curd/MySqlSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1640,5 +1640,21 @@ public void ToUpdate()
16401640
Assert.Equal(5, g.mysql.Select<ToUpd3Pk>().Count());
16411641
Assert.Equal(5, g.mysql.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
16421642
}
1643+
1644+
[Fact]
1645+
public void ForUpdate()
1646+
{
1647+
var orm = g.mysql;
1648+
orm.Transaction(() =>
1649+
{
1650+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1651+
Assert.Equal("SELECT a.`id`, a.`name` FROM `ToUpd1Pk` a limit 0,1 for update", sql);
1652+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1653+
1654+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1655+
Assert.Equal("SELECT a.`id`, a.`name` FROM `ToUpd1Pk` a limit 0,1 for update", sql);
1656+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1657+
});
1658+
}
16431659
}
16441660
}

FreeSql.Tests/FreeSql.Tests/Oracle/Curd/OracleSelectTest.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,5 +1525,21 @@ public void ToUpdate()
15251525
Assert.Equal(5, g.oracle.Select<ToUpd3Pk>().Count());
15261526
Assert.Equal(5, g.oracle.Select<ToUpd3Pk>().Where(a => a.name.StartsWith("nick")).Count());
15271527
}
1528+
1529+
[Fact]
1530+
public void ForUpdate()
1531+
{
1532+
var orm = g.oracle;
1533+
orm.Transaction(() =>
1534+
{
1535+
var sql = orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToSql().Replace("\r\n", "");
1536+
Assert.Equal("SELECT a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a WHERE ROWNUM < 2 for update", sql);
1537+
orm.Select<ToUpd1Pk>().ForUpdate().Limit(1).ToList();
1538+
1539+
sql = orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToSql().Replace("\r\n", "");
1540+
Assert.Equal("SELECT a.\"ID\", a.\"NAME\" FROM \"TOUPD1PK\" a WHERE ROWNUM < 2 for update nowait", sql);
1541+
orm.Select<ToUpd1Pk>().ForUpdate(true).Limit(1).ToList();
1542+
});
1543+
}
15281544
}
15291545
}

0 commit comments

Comments
 (0)